Android Dialer,Mms(1),高并发系统基础篇

33.使用ComponentName启动另一个应用的Activity时出现java.lang.SecurityException: Permission Denial的解决方案:原因分析:在SDK版本eclair中(Level 5-7?),如果activity没有设定intent-filter则无法被外部程序启动!解决办法:给对应的activity添加intent-filter字段,且必须带上action,即使为空也行:总结到这里的时候,由于另外两个同事有其他的事情要忙,我接手了联系人模块和
摘要由CSDN通过智能技术生成

33.使用ComponentName启动另一个应用的Activity时出现java.lang.SecurityException: Permission Denial的解决方案:

原因分析:

在SDK版本eclair中(Level 5-7?),如果activity没有设定intent-filter则无法被外部程序启动!

解决办法:

给对应的activity添加intent-filter字段,且必须带上action,即使为空也行:

总结到这里的时候,由于另外两个同事有其他的事情要忙,我接手了联系人模块和短信模块,做后续的修改。

时间不早了,今天就到这吧。

有不明白的地方,欢迎交流。

接手了同事的短信模块和联系人模块,他们完成了基础功能,我做后续修改和功能强化。

短信模块主要增加了了以下功能:

短信会话加密(九宫格手势密码和字符密保),短信收藏。

联系人模块,实现了以下功能:

联系人列表长按多选群发短信,联系人右侧快速字母定位联系人,并且把标星联系人(☆)显示在列表前,非字母开头(#)显示在列表后。

联系人模块有较多的Bug,解决这些问题的过程也学到了不少。

话不多说,继续总结……

34.Cursor先获得制定列的下标,然后根据下标获得数据(不同系统的mmssms.db/sms标的列可能不同,i9250的原生4.3系统有17列,下标0-16.MTK的4.4.2有23列,下标0-22,多出几个自定义列)

int addressIndex = cur.getColumnIndex(“address”);

int dateIndex = cur.getColumnIndex(“date”);

int typeIndex = cur.getColumnIndex(“type”);

int bodyIndex = cur.getColumnIndex(“body”);

long address = Long.parseLong(cur.getString(addressIndex));

long date = Long.parseLong(cur.getString(dateIndex));

int type = Integer.parseInt(cur.getString(typeIndex));

String body = cur.getString(bodyIndex);

ZjLockMsg newMsg = new ZjLockMsg(threadId,address,date,type,body);

35.DATABASE_VERSION的问题

注意DATABASE_VERSION 值的问题,在程序运行时,如果改变了表的个数,再次运行时会出错.这是因为数据库改变时,会调用DatabaseHelper类.执行

super(context, DATABASE_NAME,null, DATABASE_VERSION )

这个方法,此时DATABASE_VERSION所对应的表的个数或者内容都是改变之前的, 这就造成异常的出现

36.使用Cursor使,读取里面的数据用到getColumnIndex()时报错:Index -1 requested, with a size of 1

仔细阅读过Cursor的文档,发现关于getColumnIndex()这个方法的说明如下:

public abstract int getColumnIndex (String columnName)

Since: API Level 1

Returns the zero-based index for the given column name, or -1 if the column doesn’t exist. If you expect the column to exist use getColumnIndexOrThrow(String) instead, which will make the error more clear.

文档里清楚的表明:在要读取的列不存在的时候该方法会返回值“-1”。所以可知,以上报错可能是因为要get的列不存在,也可能是因为游标位置不对。后来发现,因为我在执行这个语句前没有执行“Cursor.moveToNext();”这个函数,导致游标还位于第一位置的前面,所以索引显示为“-1”,前面加上这句就没错了。

网上另有一种情况是用完Cursor没有关闭导致报此错误,所以也提醒各位用完Cursor要记得执行Cursor.close();

37.Your content must have a ListView whose id attribute is 'android.R.id.list’错误的解决办法

<ListView

android:id="@android:id/list" 或android:id="@id/android:list"

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”>

38.模糊查找历史命令

history | grep -n “adb pull”

39.adb pull取设备中的数据库

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(bitm

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值