adb pull /data/data/com.android.mms/databases/zj_msg ~/
adb pull /data/data/com.android.providers.telephony/databases/mmssms.db
40.多个设备时adb操作
在adb的指令后面加上参数 -s 比如 -s emulator-5554
就可以指定adb指令的目标。
在多个模拟器或者设备存在时很实用。
alex@alex-pc:~$ adb devices
List of devices attached
0123456789ABCDEF device
016B7EB20100B003 device
alex@alex-pc:~$ adb -s 0123456789ABCDEF install -r mtk/zj/8382/out/target/product/esky82_tb_cn_kk/system/priv-app/Mms.apk
41.setBackgroundDrawable和setBackgroundColor的用法
设置背景图片,图片来源于drawable;
flightInfoPanel.setBackgroundDrawable(getResources().getDrawable(R.drawable.search_label_click));
转换字符串为int(颜色);
listItemView.deleteFilghtBg.setBackgroundColor(Color.parseColor(“#F5F5DC”));
42.联系人标星收藏,即更改数据库starred字段值为1
ContentValues values = new ContentValues();
values.put(“starred”, 1);
this.getContentResolver().update(
ContactsContract.RawContacts.CONTENT_URI, values,
“contact_id = ?”, new String[] { contactIdStr });
43.布局元素越界时,页面滚动
在LinearLayout外面包一层ScrollView即可,如下代码
ApiDemo 中关于如何使用ScrollView说明,请参考:
<ScrollView xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“fill_parent”
android:layout_height=“wrap_content”
android:scrollbars=“none”>
44.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
这样的问题主要是签名冲突造成的,比如你使用了ADB的debug权限签名,但后来使用标准sign签名后再安装同一个文件会出现这样的错误提示,解决的方法除了只有先老老实实从手机上卸载原有版本再进行安装,而adb install -r参数也无法解决这个问题。
45.cp命令移动隐藏文件
-a参数 所有文件,包括隐藏文件
-r参数 移动目录
所以备份时,直接cp -a -r 一步到位,省得一些点文件漏操作。
46.去除应用图标
去掉Manifest中Activity的对应标签:
47.修改framework内容后编译推入设备
./mk -t mm frameworks/base/
adb push /out/target/product//system/framework/framework.jar /system/framework
adb push /out/target/product//system/framework/framework2.jar /system/framework
48.根据RawContactId获取contacts表中的lookup字段
public String getLookupKey(long contactId) {
// Cursor cur = getContentResolver().query( // Raw Contacts表
// ContactsContract.RawContacts.CONTENT_URI, null,
// “contact_id = ?”, new String[] { “”+contactId }, null);
String lookupkey = “”;
// final Uri dataUri = Uri.withAppendedPath(
// ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId),
// Contacts.Data.CONTENT_DIRECTORY);
Cursor cursor = getContentResolver().query(Contacts.CONTENT_URI, null,
“name_raw_contact_id = ?”, new String[] { “” + contactId },
null);
if (cursor.moveToFirst()) {
do {
int starIndex = cursor.getColumnIndex(Contacts.LOOKUP_KEY);
Log.e(“LookupKey Index:”, “” + starIndex);
lookupkey = cursor.getString(starIndex);
} while (cursor.moveToNext());
}
cursor.close();
return lookupkey;
}
这些内容多是我工作时,总结到Evernote的,可能不够详细,有什么不明白的欢迎交流。
今天就到这儿了,去洗个澡,明天又是新的一周,加油~
台风要来了,滴了些雨,顿时凉爽了很多。源码修改,继续。
有些Bug让人摸不着头脑,等发现了触发条件,就大致有了个分析方向,最后自然也可以找到原因。程序就是这么实在,什么反馈都是有原因的,真好。
49.解决ListView条目在应用初次启动时只能点击一次的情况,注释addFlags代码:
final Intent intent = new Intent(mPeopleActivity.this,
ViewContactActivity.class);
intent.setData(uri);
//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
50.在Adapter的onTouch监听中设置View的Down和Up事件:
if (event.getAction() == MotionEvent.ACTION_DOWN) {
view.setBackgroundColor(Color.parseColor(“#EBEBEB”));
return false;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
view.setBackgroundColor(Color.parseColor(“#ffffff”));
}
51.调整Bitmap对象的大小:
public void setPhoto(String contactId) {
// 以下代码将字节数组转化成Bitmap对象,然后再ImageView中显示出来
ImageButton ibAvatar = (ImageButton) this
.findViewById(com.android.dialer.R.id.zj_detail_avatar);
byte[] photo = getPhoto(contactId);
if (photo != null) {
Bitmap map = BitmapFactory.decodeByteArray(photo, 0, photo.length);
// 调整大小 START
int scaleWidth = 110;
int scaleHeight = 110;
Bitmap bitmap = Bitmap.createScaledBitmap(map, scaleWidth,
scaleHeight, true);
// 调整大小 END
ibAvatar.setImageBitmap(bitmap); // 参数由原来的map换成转换过的bitmap
}
}
52.调整Activity跳转动画的速度
改一下duration,500到300
<?xml version="1.0" encoding="utf-8"?><translate
android:duration=“300”
android:fromXDelta=“0”
android:toXDelta=“100%p” />
53.联系人列表标星Tag显示★而不是字母逻辑:
// 获得当前姓名的拼音首字母
String mfirstLetter = PinyinUtils
.getPingYin(Utils.mPersons.get(position).mName).substring(0, 1)
.toUpperCase();
String zjContactIdStr = Utils.mPersons.get(position).mID;
boolean isStar = isStarred(zjContactIdStr);
String firstLetter;
Log.e(“zjStar”,
“position” + position + “\tcontactId”
-
Utils.mPersons.get(position).mContactId + “\tName:”
-
Utils.mPersons.get(position).mName + “\tisStar:”
-
isStar);
if (isStar) {
firstLetter = “☆”;
} else {
firstLetter = notAlpha(mfirstLetter);
}
54.联系人标星Tag去重(多个标星归档只显示一个Tag)逻辑
// 如果是第1个联系人 那么letterTag始终要显示
if (position == 0) {
myViews.letterTag.setVisibility(View.VISIBLE);
myViews.letterTag.setText(firstLetter);
} else {
if (isStar) {
myViews.letterTag.setVisibility(View.GONE);
} else {
// 获得上一个姓名的拼音首字母
String mfirstLetterPre = PinyinUtils
.getPingYin(Utils.mPersons.get(position - 1).mName)
.substring(0, 1).toUpperCase();
String firstLetterPre = notAlpha(mfirstLetterPre);
// 比较一下两者是否相同
if (firstLetter.equals(firstLetterPre)) {
myViews.letterTag.setVisibility(View.GONE);
} else {
myViews.letterTag.setVisibility(View.VISIBLE);
myViews.letterTag.setText(firstLetter);
}
}
}
private String notAlpha(String str) {
if (str == null) {
return “#”;
}
if (str.trim().length() == 0) {
return “#”;
}
// 正则表达式,判断首字母是否是英文字母
Pattern pattern = Pattern.compile(“1+$”);
if (pattern.matcher(str).matches()) {
return (str).toUpperCase();
} else {
return “#”;
}
}
56. 联系人列表右侧快速定位字母条监听
// 字母列触摸的监听器
private class ScrollBarListener implements
AlphabetScrollBar.OnTouchBarListener {
@Override
public void onTouch(String letter) {
if (letter.compareTo(“☆”) == 0) {
m_contactslist.setSelection(0); // 跳转到列表开始
} else if (letter.compareTo(“#”) == 0) {
int zjCount = m_contactslist.getChildCount();
m_contactslist.setSelection(zjCount); // 跳转到列表最后位置
} else {
// 触摸字母列时,将联系人列表更新到首字母出现的位置
int idx = Utils.binarySearch(letter);
if (idx != -1) {
m_contactslist.setSelection(idx);
}
}
}
}
57.搜索联系人过滤器
public void FilterSearch(String keyword) {
mFilterList.clear();
// 遍历mArrayList
for (int i = 0; i < Utils.mPersons.size(); i++) {
// 如果遍历到List包含所输入字符串
-
boolean isSearchNum = Utils.mPersons.get(i).mNum == null ? false
- (Utils.mPersons.get(i).mNum.indexOf(keyword) > 0);
if (isSearchNum// 为空时 报错
|| isStrInString(Utils.mPersons.get(i).mPY, keyword)
|| Utils.mPersons.get(i).mName.contains(keyword)
|| isStrInString(Utils.mPersons.get(i).mFisrtSpell, keyword)) {
/