Android2.3修改联系人头像的尺寸和大小

从联系人列表ContactsListActivity.java开始找起,当长按某一个联系人时会弹出Dialog(其实是一个ContextMenu),需找menuitem,找到了case MENU_ITEM_EDIT,这里面会有一个Intent intent = new Intent(this,EditSimContactActivity.class),这是跳转到sim卡联系人,其实还有一个EditContactActivity。

下面来看看EditContactActivity,因为设置头像的一系列操作最终会回到EditContactActivity,那么肯定要在onActivityResult函数中去找,在这个函数中有两个case,PHOTO_PICKED_WITH_DATA和CAMERA_WITH_DATA,第二个最终还是会调用第一个,那直接在第一个case里面找。锁定了这句requestingEditor.setPhotoBitmap(tempBmp); ,requestingEditor是一个BaseContactEditorView,那么去BaseContactEditorView找,找到mPhoto.setPhotoBitmap(bitmap);,mPhoto是一个PhotoEditorView,好了,找到PhotoEditorView的setPhotoBitmap就可以动手了。

首先是尺寸,默认是250*250的,比如我想改成160*160,后来发现这个尺寸是在EditContactActivity里面有一个常量ICON_SIZE,改了就好。

接下来是大小,必然要压缩,比如我想把这个图片的大小限制在5K以内,使用PNG?NONONO!PNG格式压缩以后没有太大变化,那么只能压缩成JPG了。压缩的过程中我发现ByteArrayOutputStream的flush()方法无法清空里面的内容,哎,回去重新学习一下IO流。我用了一个笨办法,每次循环重新创建ByteArrayOutputStream对象。下面是代码:

for (int i = 0; i <= 10; i++) {
					ByteArrayOutputStream tmpBA = new ByteArrayOutputStream(size);
					bitmap.compress(Bitmap.CompressFormat.JPEG, 100-10*i, tmpBA);
					Log.v(TAG, "the tmp size is"+tmpBA.size());
					if (tmpBA.size() <= 5000) {
						out = tmpBA;
						Log.v(TAG, "break");
						Log.v(TAG, "< the final size is"+out.size());
						break;
					}
					if (i == 10 && tmpBA.size() > 5000) {
						out = tmpBA;
						Log.v(TAG, "=> the final size is"+out.size());
					}
				}

编译运行后发现data/data/com.android.providers.contacts/databases下的数据库中data15字段里面的BLOB依然大于5K,看来改错地方了。

纠结了半天,改了packages/providers/ContactsProvider/src/com/android/providers/contacts/下的ContactsProvider2.java ,这里面的压缩代码和PhotoEditorView很像,目前还不明白是怎么调用的,请看博客的高手帮忙解答。



你可能感兴趣的:(android,数据库,IO,dialog,menu)