2016年Android开发相关的问题总结

问题一:如何实现蓝牙自动断开(不是关闭蓝牙开关)?

解决思路:step1:获取当前已经连接的蓝牙设备

                 step2:断开与这个蓝牙设备的连接

实例代码:

LocalBluetoothManager mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, null);
CachedBluetoothDeviceManager mCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
ArrayList<CachedBluetoothDevice> mCachedDevices = (ArrayList<CachedBluetoothDevice>) mCachedDeviceManager.getCachedDevicesCopy();

for (CachedBluetoothDevice tmp : mCachedDevices) {
      // Log.d(TAG,"cacheDevice name is "+tmp.getName()+",cacheDevice state is "+tmp.getBondState() +",cacheDevice connected is "+tmp.isConnected());
      // if (tmp.getBondState() == android.bluetooth.BluetoothDevice.BOND_BONDED){//(经测试,这样判断也是可以的)
               if (tmp.isConnected()) {
                      tmp.disconnect();
                      showDisconnectDialogOrToast(context);
                }
 }


问题二:mt8173平台上如何替换关机充电图标?开机第一幅图片?开机动画?进入recovery模式的动画?

1.关机低电量图标:source/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/qxga/qxga_low_battery.bmp

2.关机充电图标:source/system/core/healthd/images/xxx.png,详细相关的修改代码在source/system/core/healthd/healthd_mode_charger.cpp

    主要涉及的修改有:static struct frame batt_anim_frames[] ={{.disp_time=750,.min_capacity=0,.level_only=false,.surface=NULL},...}

                                     void healthd_mode_charger_init(struct healthd_config* config){

                                     ...

                                     ret = res_create_display_surface("charger/Charging_battery_20", &charger->batt_anim->frames[1].surface);
                                     if (ret < 0) {
                                       LOGE("Cannot load charging battery 20% image\n");
                                       charger->batt_anim->frames[1].surface = NULL;
                                     }

                                     ret = res_create_display_surface("charger/Charging_battery_30", &charger->batt_anim->frames[2].surface);
                                     if (ret < 0) {
                                       LOGE("Cannot load charging battery 30% image\n");
                                       charger->batt_anim->frames[2].surface = NULL;
                                     }  

                                     ...

                                     }

3.开机第一幅图片:source/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/qxga/qxga_uboot.bmp

4.开机动画:

   1).代码位置:source/frameworks/base/cmds/bootanimation/BootAnimation.cpp
   2).一般需要替代的资源:
      #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"
   3).注意事项:(打包的时候一定不要压缩文件(压缩比为0))
      必须用命令来压缩图片:zip -r -X -Z store bootanimation part*/*.png desc.txt
   4).desc.txt的内容一般如下:
      320 480 10 //320:屏幕宽(像素),480:屏幕高(像素),10(一秒的帧数,或者sud理解为1s内显示的静态的图片数)
      p 1 0 part1 //part1 播放一遍,间隔时间断为0,只播放一次,播放一次 的时间需要小于系统原本开机的时间,否则会拖慢开机速度(播放完才进系统)
      p 0 0 part2 //part2 播放无限次,随时可以推出播放,也就是只要开机加载完毕就可以直接跳到系统

    5)开机动画在手机文件系统中的位置:/system/media/bootanimation.zip,一般开机动画不宜超过3M.

5.进入recovery模式的动画:

   source/bootable/recovery/res-xhdpi/images/icon_installing.png


问题三:如何设置默认后台进程数?

解决办法:try {
                    ActivityManagerNative.getDefault().setProcessLimit(7);
                 }catch(RemoteException e){
                    reportWtf("setProcessLimit:", e);
                 }


问题四:有哪些方便的adb调试命令?

            1、模拟事件:adb input keyevent 3 (模拟back键)

            2、挂载根目录:step1:adb shell (进入进入目标设备的Linux Shell环境)

                                        step2:mount -o remount rw /

            3、快速过滤logcat中的crash信息:adb logcat | grep androidrun -i

            4、模拟启动某个activity:adb shell am start -n [packageName]/[packageName.MainActivity]

                                                        adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n breakan.test/breakan.test.TestActivity


问题五:sha1加密算法相关

            1、在linux下直接调用sha1sum命令获取某个文件的sha1码:如sha1sum  '/home/test/IMG20160830095213.jpg'

            2、sha1算法Java实现

             /**
                 * 也可以适用于大的文件
                 */
                public static String getFileSha1(String path, String fileName) throws OutOfMemoryError, IOException {
                    File file = new File(path, fileName);
                    FileInputStream in = new FileInputStream(file);
                    MessageDigest messagedigest;
                    try {
                        messagedigest = MessageDigest.getInstance("SHA-1");
                        byte[] buffer = new byte[1024 * 1024 * 10];
                        int len = 0;
                        while ((len = in.read(buffer)) > 0) {
                            //该对象通过使用 update()方法处理数据  
                            messagedigest.update(buffer, 0, len);
                        }
                        //对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。
                        return byteArrayToHexString(messagedigest.digest());
                    } catch (NoSuchAlgorithmException e) {
                        e.printStackTrace();
                    } catch (OutOfMemoryError e) {
                        e.printStackTrace();
                        throw e;
                    } finally {
                        in.close();
                    }
                    return null;
                }

                private static String byteToHexString(byte ib) {
                    char[] Digit = {
                            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
                            'D', 'E', 'F'
                    };
                    char[] ob = new char[2];
                    ob[0] = Digit[(ib >>> 4) & 0X0F];
                    ob[1] = Digit[ib & 0X0F];
                    String s = new String(ob);
                    return s;
                }

                // 将字节数组转换为十六进制字符串
                private static String byteArrayToHexString(byte[] bytearray) {
                    String strDigest = "";
                    for (int i = 0; i < bytearray.length; i++) {
                        strDigest += byteToHexString(bytearray[i]);
                    }
                    return strDigest;
                }


问题六、如何分析android系统卡顿(内存相关)?

               1.实时查看内存:adb procrank 或者 adb shell cat /proc/meminfo
                   一般:VSS >= RSS >= PSS >= USS.(一般上层都关注PSS,剩余空间的大小一般是:MemFree + cached)
                   VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)是单个进程全部可访问的地址空间
                   RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,

                               对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。
                   PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
                   USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止, USS 就是实际被返还给系统的内存大小。USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加
              2.实时查看某个应用的内存:adb shell dumpsys meminfo com.teleca.robin.test
              2.1.使用adb shell procrank 命令(仅ENG版本可用),查看有哪些app占用内存过多 ,请以PSS栏位为参考,重点关注自己安装的一些APK以及PSS值比较大的process
              2.2.对于2.1中占用比较异常的process,可以透过 adb shell showmap [pid](仅ENG版本可用)查看具体使用情况。
              3.实时打印一个进程的log//logcat -v process | grep 670
              4.查看当前的内存阀值:adb shell getprop | grep dalvik.vm.heapgrowthlimit
              //注意:dumpsys meminfo可以查看native进程和java进程,而procrank只能查看java进程。


问题七、如何实现去掉密码锁?

               方法1: 如果你设置的是图形密码,你只需要用re管理器将data/system文件夹下的 gatekeeper.pattern.key文件删除就可以了
                           如果你设置的是数字密码,你只需要用re管理将data/system文件夹下面的gatekeeper.password.key删除就可以了

               方法2:用代码实现

                          public void removePasswardOfLocksreen(){
                                LockPatternUtils lockutil = new LockPatternUtils(PTAccountLoginActivity.this);
                                lockutil.clearLock(UserHandle.myUserId());
                                lockutil.setLockScreenDisabled(false,UserHandle.myUserId());
                          }


问题八、如何在Android studio里面格式化代码

                方法:点击菜单键单里面的Code ---> Reformat Code,然后保存即可.


问题九、如何在特定的文件里面快速查找包含某些内容?

                方法:find . -name "*.java" | xargs grep "android"


问题十、scp命令的简单使用

                  1.从本地拷贝到远程.
                      scp /media/somebody/work/bootanimation.zip someone@192.1.11.7:/home/
                  2.从远程拷贝到本地.
                      scp someone@192.1.11.7:/home/root/others/music/1.mp3 /home
                      scp -r  somone@192.1.11.7:/home/test/ .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值