问题一:如何实现蓝牙自动断开(不是关闭蓝牙开关)?
解决思路: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/ .