一:是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();//这句话重要
} 通过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
array
\\192.168.119.111\liuweinan\L7-R1\android\packages\apps\Settings\res\values-zh-rCN这个目录下改成
strings
array
十四: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修复的代码示例:
十六: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:比如手机里面有个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找到对应的
加内容:
修改值:
修改对应的韩文和中文下面都加字段。
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蓝牙设备
想看的私信哈哈