Settings--解决的bug总结xuqiu

一:是A1手机项目中

Location位置信息->Mode模式-->加速定位

BUG描述:之前这个点击打开,然后会弹出第三方的界面对话框,高通代码,我们看不到,选择那个链接地址,由于这个手机没有安装浏览器,所以程序会崩。

知识点

interface IXTSrv
{
    boolean disable();
    boolean getStatus();
    String  getText(int which);
    void showDialog();
    void registerCallback(IXTSrvCb cb);
    void unregisterCallback(IXTSrvCb cb);
}
这个接口是底层写的,他的原理是为什么里面的方法看不到,他会有另外一个中间类来转化到另外一个类,里面来实现这个接口里面的方法,这个接口被高通封了。
这种aidl文件的用法:mXTService = IXTSrv.Stub.asInterface((IBinder)service);固定的
解决的方法:当时是remove();这个preference
新的BUG描述:现在是打开界面是看不到这个控件了,但是如果之前的版本是开了加速定位的,也就是保存了这个开着的值,现在升级版本,你虽然看不到这个控件了,但是这个控件其实还是开着的,就是相当于,这个加速定位还是开着的。现在就想真实的关闭
解决的方法:只要手机开机就会走这个BootCompletedReceiver广播接收者。因为这个广播接受者不能bindService绑定服务,所以将处理的方法,放到他启动的一个服务里面,模仿LocationMode这个类中处理的写法
 	mServiceConn = new XTServiceConnection();
        Intent i = new Intent(IXTSrv.class.getName());
        izatConnResult = getActivity().bindService(i, mServiceConn, Context.BIND_AUTO_CREATE);将i和new出来新的绑定服务。
 private class XTServiceConnection implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service){
            mXTService = IXTSrv.Stub.asInterface((IBinder)service);     
		mXTService.disable();//这句话重要
          }
        @Override
        public void onServiceDisconnected(ComponentName name){
           
    }
	通过mXTService.disable();这句话就可以将状态变为false。然后locationMode每次进入界面的chek状态选择的都是false也就是每次都是关着的状态。


补充:之前的bug是这样的,location->mode里面四个选项,第四个是第三方软件默认是关闭的。
第一个bug描述:比如版本一:打开了第四项,升级到版本二的时候需求是去掉第四项,结果去了,但是其实选项还是开着的,会耗电。
处理:mIZat的点击事件做处理,结果就是使他一直是关闭状态,不让打开
if(null != mIZat){
            mIZat.setOnPreferenceChangeListener(
                new Preference.OnPreferenceChangeListener(){
                    public boolean onPreferenceChange(Preference preference, Object newValue){
                        final boolean chooseValue = (Boolean) newValue;
                        if(chooseValue){
                            try{
                                if(null != mXTService){
                                    mXTService.showDialog();
                                    }
                                }catch(RemoteException e){
                                    e.printStackTrace();
                                }
                        }else{
                            try{
								
                                if(null != mXTService){
                                    mXTService.disable();
                                }
                            }catch(RemoteException e){
                                e.printStackTrace();
                            }
                        }
                        return true;
                    }
                }
            );
最后在前面设状态。
        mIZat.setChecked(mXTService.getStatus());
第二个bug描述:就是上来手机默认初始化时打开这个第三方软件的
处理:
二:是R1手机settings的快捷方式拖出去以后会弹出一个界面
BUG:因为辅助功能和屏幕保护2个不需要,所以要去掉
解决方法:CreateShortcut这个类就是那个快捷方式的activity,进来就执行这个onQueryPackageManager查询方法,将manist中带SHORTCUT这个字段的activity全查出来,显示到这个list上
else if(info.activityInfo.name.endsWith(AccessibilitySettingsActivity.class.getSimpleName())){
				activities.remove(i);
				}
这样就把匹配的值就去了,注意import com.android.settings.Settings.DreamSettingsActivity;加这个导入系统的。
三:是A1手机Settings里面的导航条actionBar全部去掉
解决方法:找到每个界面对应的xml布局文件注销掉
搜到每一个include,都注销掉。然后,每一个里面的控件都要找到实例化的都的注销掉
知识点:可以写一个布局,通用这个布局的话就按照上面的那种写法的方式。改也好改。
四:是A1手机Settings里面raderWheel中的问题
BUG:就是查询出设备了,点击连接,同时快速的扣电池。正常来说,已经连上了,但是开机之后发现自动连接不上,还要进去之后才能点击连上。
知识点:
解决的方法:在linearLayout的点击事件里面将editor.putString("RadgerWheel_Connect_Address_old", "null");注销掉,可以解决!经理说,不是这个问题,是sharedpreferences存储问题,需要时间
 
  
 
  
 
  

五:是A1手机Settings里面raderWheel的设备和手机连接之后,点下去设备但是不按上来,点下去之后我关闭蓝牙开关或者退出连接。

BUG:就是按关机键会一直出来呼叫那个界面,意思就是按下了,上来键没执行,所以一直是呼叫状态。

解决方法:

ptt_key_ = characteristic.getIntValue(format, 0);接受设备按键数据是0或者1

if (ptt_key_ == 1) {if (DBG) Log.d(TAG,"CODA BT_PTT_Msg === Pressed");intent.putExtra("event_action", KeyEvent.ACTION_DOWN);} else if (ptt_key_ == 0) {if (DBG) Log.d(TAG,"CODA BT_PTT_Msg === Released");intent.putExtra("event_action", KeyEvent.ACTION_UP);}sendBroadcast(intent);

打完log之后可以看到,广播少发了一条上键的消息,所以要加发一条,分别在:

else if(action.equals("BluetoothDisconnect")){if(ptt_key_==1){Intent intent2 = new Intent("com.android.bluetooth.support.BTPTTKey");if (DBG) Log.v("lwn","zoul up");intent2.putExtra("event_action", KeyEvent.ACTION_UP);sendBroadcast(intent2);}

---------------------------------------------设备断开连接

else if(action.equals("BluetoothSwitchOff")){if(ptt_key_==1){Intent intent2 = new Intent("com.android.bluetooth.support.BTPTTKey");if (DBG) Log.v("lwn","zoul up");intent2.putExtra("event_action", KeyEvent.ACTION_UP);sendBroadcast(intent2);}

--------------------------------------------关闭蓝牙开关

六:是A1手机Settings里面raderWheel的设备和手机连接之后,关闭设备,关机开机之后显示的还是连接的设备,其实我的设备已经关闭了。

原因:开机之后后台跑的服务,条件是"RadgerWheel_Connect_Address_old"这个地址不为null就连接了。

解决:因为连接上之后,一旦手机断开,或者设备断开,这个时候的RadgerWheel_Connect_Address这个字符串全都应该值为null。

if(! (sharedpreferences.getString("RadgerWheel_Connect_Address_old","null")).equals("null")){editor.putString("RadgerWheel_Connect_Address","null");//[liuweinan2015-5-11add]editor.commit();//[liuweinan2015-5-11add]mHandler.sendEmptyMessage(0); }

----------------------------------------------------还应该在设备关闭那个地方也加上将当前地址值为null

七:是A1手机Settings里面DataUsageSummary数据流量的问题。

BUG:插上手机卡之后,会显示选择框,紧接着是流量使用周期,旁边是spinner。现在就是进来之后,按下键,会跑到第一个checkBox,再按2次下键才能到了spinner控件上。客户只想按一次。

知识点:当listView需要添加headView的时候,可以通过这个addHeaderView(mHeader, null, false);方法进行添加,如果header不想被选中可以设为false,想被选就设为true

解决方法:因为每个条目都是listView,给每个条目用inflate转化添加

mHeader = (ViewGroup) inflater.inflate(R.layout.data_usage_header, mListView, false);

mListView.addHeaderView(new View(context), null, false);这个是填空的view,将true改为false

        mListView.addHeaderView(mHeader, null, false);将mheader添加上去将,true改为false

新的BUG:虽然可以实现点一次就可以了,但是新的问题,点了spinner会直接到了下面的listView,自己失去焦点了。而且会刷新2秒

解决方法:注销沉睡的2S, mListView.addHeaderView(mHeader, null, true);这个listView的可以点击。

八:是A1手机Settings里面DataUsageSummary数据流量的问题。

BUG:插上卡,点击spinner控件到最下面,选择日期时间控件,当点到31天的时候就不能动了。

解决方法:在framework下面那个控件的点击事件那个条件多加了个括号

九:A1手机Settings里面-->安全-->应用操作-->点击摸一个会弹出一个新的界面

BUG:就是spinner下面换成英文的时候就不齐了,看不全

解决方法:将这个布局写死了,按权重比写死的

十:换logo图标

BUG:正常的换了图片了,但是编译出来还没有变

知识点:

drable下面的mipmap下:h开头的是手机分辨率480-800,l开头的是240*320,m开头的是320*480,用m了。

解决方法:知道那个文件的layout目录下执行一下命令。先到manifest文件下,看看,icon在哪放的,一般是mipmap下面,知道改了就好。

touch *主要是这句话

ls-la查看文件修改的时间。可以看到是否修改了。

十一:马上回学校了来了四个BUG一一解决

BUG:移动4G卡在更多->移动网络->首选网络模型->只选GSM。设置->流量试用情况->spinner->弹出的对话框控件,选中摸一个日期,修改了,但是没有保存的方法

知识点:cycleDayPicker.clearFocus();                           final int cycleDay = cycleDayPicker.getValue();                           final String cycleTimezone = new Time().timezone;                           editor.setPolicyCycleDay(template, cycleDay, cycleTimezone);                           target.updatePolicy(true);onDismiss(getDialog());上面的这些方法,就是改变了值后做的操作。

解决方法:加了个Button按钮。来保存,模仿返回键的操作。

十二:学校归来上班

BUG:R2手机的Radgel wheel的BUG:连接设备(一切正常连接了)-->关机(设备因为搜索不到就自动休眠了,等到开机)-->开机后进入手机查询搜索不到,唤醒设备-->显示查出设备来但是没连接,正常的来说是直接进来就是连接了,设备也是绿色的闪亮就证明是连接状态。

流程:在界面进入之后要查询:做俩件事1:判断有旧的地址,然后就发送广播过去后台服务,将设备真正连接。2:将名字改了显示成连接状态(跟第一步关联)。3:还遇到个问题,是进来之后显示了连接的设备名字,又显示了个同样设备的没有连接状态的名字信息,这时候就加个条件判断就可以了。

知识点:String address_old_=sharedpreferences.getString("RadgerWheel_Connect_Address_old","null");if(address_old_.equals(device.getAddress())){final Intent iintent = new Intent("BluetoothConnect");Bundle bundle = new Bundle();bundle.putParcelable("BlutoothDevice", device);iintent.putExtras(bundle);sendBroadcast(iintent);}

下面是刷新适配器

----------------------------------------------------------------------

if(address_old_.equals(device.getAddress()))如果是旧的地址跟新地址一样就删了                   {                   mLeDeviceListAdapter.deleteDevice(device);mLeDeviceListAdapter.notifyDataSetChanged();                   }

总结:还有一个问题是出现了unknown的这个东西,也是个BUG。原来保存那俩mac_adress是在后台服务那边做的,真正的连接也是在后台连接的。

十三:BUG

BUG:internet浏览器上点击退出,应该是韩文,结果是英文,需要将中文修改为韩文。不能编译还是该文件的那有问题,没改对,比如注释的问题。,完了要用浏览器浏览一遍,才知道哪有错误。浏览器能看清楚,反正以后就是用比较工具来修改xml文件,要步编译不过,不过的解决办法就是回退,重新修改,不要加注释。如果遇到目录文件里面没有的情况,肯定是跳转到别的应用里面了,这个时候就查是跳到哪个应用了,然后进去进行修改。

流程:packages/apps/browser/res/valuse/---英文目录

packages/apps/browser/res/valuse-zh/---中文目录,直接修改,最后比较一下。

packages/apps/browser/res/valuse-ko/---韩文目录,修改韩文用比较工具修改

只需要将对应的内容改了,提交bug也是需要touch*

知识点:解决了设置完字之后改变字

步骤:1:\\192.168.119.111\liuweinan\L7-R1\android\packages\apps\Settings\res\values英文目录下找到对应的英文

strings

wake up

array

Screen key /PTT  key syn key

\\192.168.119.111\liuweinan\L7-R1\android\packages\apps\Settings\res\values-zh-rCN这个目录下改成

strings

唤醒

array

Screen/PTT键 任意键

步骤:2:进入对应的values目录执行touch *

十四:BUG

BUG:datausage流量设置那出来wifi的按下键不能在list上。

流程:mListView.addHeaderView(new View(context), null, false);//[liuwienan2015-7-8update] -[true]        mListView.addHeaderView(mHeader, null, false);没法说

十五:BUG

BUG:baterry电池耗时和下面的移动网络信号之间的距离有点小,设置了大字体显示不全。

解决:分析一遍BatteryHistoryChart extends View流程知道那个布局是画出来的没法改,拉大距离高度变为原来的3倍onSizeChanged->mLevelOffset = mPhoneSignalOffset + (mHavePhoneSignal ? barOffset : 0)                    + ((mLineWidth*3)/*/2*/);

十六:BUG

BUG:Settings的桌面小部件问题,Settings中的AccessibilitySettings是新的界面,但是从桌面启动进入后还是原来的界面,不是新的界面。

解决:CreateShortcut这个类就是桌面小组件的Settings,会将filtter中有SHORTCUT的都过滤出来,所以显示出来的就是过滤后的几个header。当点击其中的一项会执行onListItemClick走setResult(RESULT_OK, intent);finish();也就是相当于点完直接退出,改变Settings的名字。当这个时候再次点击就是跳转到名字对应的界面了,实质是这样的:manifest中name="Settings$AccessibilitySettingsActivity"这个就是启动的假activity是Settings的一个类,里面的内容是空,启动它相当于还是启动Settings, public static class StorageUseActivity extends Settings { /* empty */ }固定写法。

android:name="com.android.settings.FRAGMENT_CLASS"                android:value="com.android.settings.AccessibilityTouchSettings" />这个才是真实的启动包名.类名。

流程就是这样。

改的地方:value换成你要启动的包名和类名。这个时候程序会报错。java.lang.IllegalArgumentException: Invalid fragment for this activity:这个错误。

个人总结:

应该说,这种修复方式,只是起到一个提醒的作用,最终的安全还是交由开发者承担。另外,目前很多应用都是基于2.X的,所以要兼容在4.4上跑而不crash,只要在PreferenceActivity的子类都补充加上isValidFragment方法就可以了。但对于4.4之前的版,如果存在这种权限泄露的问题,还是需要单独处理的。下面给出兼容2.X~4.4修复的代码示例:

[java]  view plain copy
  1. public final class MyPreferenceActivity extends PreferenceActivity {  
  2.       
  3.     private boolean doValidcheck(String fragmentName) throws IllegalArgumentException{  
  4.         //TODO 做合法性检查  
  5.           
  6.         return true;  
  7.     }  
  8.       
  9.     //添加上这个方法,以使2.x~4.3的代码在4.4上可以正常运行  
  10.     protected boolean isValidFragment(String fragmentName) {  
  11.         return doValidcheck(fragmentName);  
  12.     }  
  13.       
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         //在onCreate前就做合法性判断  
  17.         String fragmentname = getIntent().getStringExtra(":android:show_fragment");  
  18.         doValidcheck(fragmentname);  
  19.   
  20.         super.onCreate(savedInstanceState);  
  21.     }  
  22. }  

十六:BUG

BUG:Settings的radger的bug,当设备连接好了之后关机设备自动休眠,开机之后正常的话是开机了蓝牙开了之后点击唤醒设备会自动连接,但是这时候却不能连接。

复线之后打出的LOG:显示后台服务BluetoothCODAService中的BluetoothAdapter.isEnabled()是false,也就是。通过查询BluetoothAdapter中的isEnable方法中打LOG发现:正常的流程是开机服务启动,发送handle消息,如果BluetoothAdapter.isEnabled()是true,才开始查询,自动连接旧的设备,但是现在返回的是false,也就是那个有问题,分析LOG得出,蓝牙没开,enable是false,这个时间段之中就发消息来查询设备,肯定是false,解决这个问题就是,等蓝牙设备完全开启之后再发送消息查询设备自动连接。

注意:上面的复线只是偶尔会出现那种情况。正常情况还是正常发送消息,这个只不过是做个修复的代码。提前抓取状态。很重要。又加了个如果加上后只要蓝牙,开或者关,都是先走

BluetoothAdapter.ACTION_STATE_CHANGED所以,避免查询2次,再里面做了个true-false的标志处理。

解决:注册一个intentfilter

IntentFilter mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
			registerReceiver(mReceiver, mIntentFilter);
接收它的动作
BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

			action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
                switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
                    case BluetoothAdapter.STATE_ON:
                        mHandler.sendEmptyMessage(0); 
                        break;
                    default:
                        break;
                }
            }

如果adapter打开之后才发送消息查询设备。

知识:比如你这边广播接收者要接收动作了,就注册一个动作给,如果接收到的动作和这个注册的一样就执行你的总舵。

十七:BUG

BUG:Settings的radger的bug,长按home键,移除现在的进程,会出现这个情况设备自动断开连接,但是显示的还是连接,是因为杀死settings的时候连它对应的codaservice一起杀死了。

解决问题:在xml文件注册的时候给它指定到系统的进程中,这样杀死的就不是它了,同样的界面也要放到同一个进程中

android:process="system"


分析了一段时间蓝牙的整个流程。后续写

分析了一段时间下面这个bug的流程,设置静音的流程,后续写。


十八:BUG

BUG:setting->sound->volume->ringtone¬ifications的bug,按左键到进度条底,会变成震动,需求是再按会变成静音,因为外面的侧键按到底再按一次就变静音,当然二者的原理是有区别的。后续分析流程

解决问题:在volume的这个界面类RingerVolumePreference中第二个seekBar中修改。

大致思路:当我按左键到最低的时候是震动模式,再按左还会进来,判断:如果进度条是0&&模式是震动,就将现在的模式设置为静音。同理,按右的时候,判断:如果进度条是0&&模式是静音,就将现在的模式设置为震动。通过手动调用,因为走framework行不通。

if (isdown) {
	if (mSeekBars[1].getProgress() == 0 && ringMode==AudioManager.RINGER_MODE_VIBRATE){
		ringMode=AudioManager.RINGER_MODE_SILENT;
		mAudioManager.setRingerMode(ringMode);
		}
		else{	
		mSeekBarVolumizer[1].changeVolumeBy(-1);
		}
	}
if (isdown) {
	if (mSeekBars[1].getProgress() == 0 && ringMode==AudioManager.RINGER_MODE_SILENT){
		ringMode=AudioManager.RINGER_MODE_VIBRATE;
		mAudioManager.setRingerMode(ringMode);
		}
		else{
		mSeekBarVolumizer[1].changeVolumeBy(1);
		}
		 }


十九:BUG

BUG:比如手机里面有个Setiings应用软件,我不想让他在手机里面显示。

知识点:查找mk文件,在服务器上。

先进入你要找的应用的目录下。

(1)cd 目录

(2)vi  Android.mk     会出来LOCAL_PACKAGE_NAME := Email这个东西,Email就是我们要下面搜索的。

(3)在回退到android大目录下,搜索Email。

(4)find . -type f - name * .mk | xargs grep -rn 对应应用的名字

会列出所有的,一般是找到build/target/product这个和device/qcom/common都行都要看看


方法:在目录文件./device/qcom/common/common.mk和./build/target/product/generic_no_telephony.mk:中注销Settings对应的mk文件

例如:

PRODUCT_PACKAGES := \

    
    rsota_sys \
    rsota_ui \
#    VoiceDialer
#    Camera \
#    Email \

 反斜杠是换行符,上面那2个表示在一行。下面那三个也是再一行。 
  

现在注销lwn

PRODUCT_PACKAGES := \
    
    rsota_sys \
    rsota_ui 

#    VoiceDialer\
#    lwn\
#    Camera \
#    Email \
就表示lwn这个字段跟下面的#注释语句在一条上,全注释了。

如果放开其中一个camera.......

PRODUCT_PACKAGES := \
    
    rsota_sys \
    rsota_ui \
Camera 

# VoiceDialer\

# Email \

 
  

这样开了手机就启动了你要的app了


验证方式:需要在system下面把email的apk删除 ,编译看还有么有出来、


二十:BUG
BU:1:添加一个小,Settings设置里面,显示-->字体大小,原来有3个,小,中,大,现在要重新分配。变成4个,但是最大的那个值不能改变,因为变的太大,就有时候UI放不下,所以只能在最大值固定的情况下,修改重新分配4个。

在packages\apps\Settings\res\xml\display_setting.xml里面找到:
                android:key="font_size"
                android:title="@string/title_font_size"
                android:summary="@string/summary_font_size"
                android:entries="@array/entries_font_size"对应的是对话框中的:正常,大 ,超大
                android:entryValues="@array/entryvalues_font_size"对应的是每个属性的值1.0 |1.15|1.3
                android:dialogTitle="@string/dialog_title_font_size"

现在多加一个:目录

android\packages\apps\Settings\res\values\arrays.xml找到对应的

加内容:


    Small
        Normal
        Large
        Huge
   

修改值:


0.85
        1.0
        1.15
        1.30
   

修改对应的韩文和中文下面都加字段。


BUG2:修改默认字体大小

方法一:

frameworks/base/core/java/android/content/res/Configuration.java文件的
public void setToDefaults() {
        fontScale = 1.0;        修改这,但是注意这的值必须和上面的1.0|1.15|1.30对应。不能瞎给
        mcc = mnc = 0;
        locale = null;
        userSetLocale = false;
        touchscreen = TOUCHSCREEN_UNDEFINED;
        … …

方法二:

用属性来控制默认字体大小,这样修改就方便多了。
(1)frameworks/base/core/java/android/content/res/Configuration.java:
import android.os.Build;
public void setToDefaults() {
String scale = Build.DEFAULT_FONTSCALE;
if ( scale.equalsIgnoreCase( Build.UNKNOWN ) == false )
{
fontScale = Float.valueOf( Build.DEFAULT_FONTSCALE ).floatValue();
}
else
{
fontScale = 1.0f;
}
(2)frameworks\base\core\java\android\os\Build.java
        /**a property to set fontScale */
public static final String DEFAULT_FONTSCALE = getString("ro.property.fontScale");
(3)这样就可以通过系统属性的方式设置好默认字体大小。

二十:需求

更新/修改android\vendor\qcom\proprietary\bns文件夹下面的apk。

问题1:如果名字都一样,我直接覆盖过来就可以了,编译的时候直接add。

问题2:如果有的APK名字不一样,我的将新的APK放进来。同时在\android\vendor\qcom\proprietary\bns目录下的mk文件里面和android\device\qcom\msm8226将对应的apk文件里面添加新的名字。因为要编译。

问题3:提交不成功,有人修改了这个目录下的文件,所以git pull拉代码,然后回退。再提交。

BUG:如果放进来的还是原来的APK只不过是名字变了

方式一:直接放进来,将原来的删除,git rm 路径 。把现在的名字改成原来的。git add就会看到识别出来是改了个名字。

方式二:删除原来的,新的放进来,在\android\vendor\qcom\proprietary\bns下面找到原来的apk文件名,改成现在的。android\device\qcom\msm8226下面的mk文件也改。怎么知道这些目录的?用 find . -type f - name * .mk | xargs grep -rn 对应应用的名字这个就搜出来目录了。


二十一:需求
Settings界面:进入第一级菜单走log,点击进入二级菜单不谈,从二级返回来再弹。

(1)外面加个标志privateboolean biaozhi;不给默认值,就是false

(2)在onbuild()中给值biaozhi=true;这个不对,因为在原生的安卓系统代码中,打LOg看看到底哪个方法是只走了一次。原生是onCreate中
(2)在onResume()里面

if(biaozhi){ biaozhi=false;

Log.v("lwn","guangbo");}

(3)点击事件onHeaderClick()里面

super.onHeaderClick(header, position);走完父类的

biaozhi=true;
就可以实现,为什么这样做,因为Settings这类构造复杂,二级菜单全是Settings的子类,进入二级菜单会再走Settings这个类。

二十二:一个三方应用的接口

想看的私信哈哈

二十三:新加的SHP蓝牙设备

想看的私信哈哈




你可能感兴趣的:(BUG解决)