我正在尝试创建一个联系人窗口小部件,其中显示带有联系人图片和名称的GridView,在按下该视图时打开相应联系人的信息,但是我在显示图片时获得权限拒绝小部件。
首先,我创建了一个应用来测试显示GridView并查询联系人。我提到这个是因为这意味着我必须包含正确的权限(android.permission.READ_CONTACTS)才能让应用程序正常工作。一旦它工作,我试图创建一个做同样事情的小部件。除了显示有图片的联系人的图片之外,其他所有工作都是有效的,但由于以下例外而无效:
07-05 22:43:16.934: E/DatabaseUtils(17897): java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts/165/photo from pid=710, uid=10065 requires android.permission.READ_CONTACTS
相应的应用程序是com.teslacoilsw.launcher(Nova?)而不是我的包名,如果重要的话。但我很困惑:该应用程序读取一切正常并显示照片。小部件读取联系人的显示名称和查找URI就好了,但是在尝试阅读图片时会出现这些异常。有什么方法我应该为小部件添加额外的权限吗?
以下是我创建RemoteView并添加信息的代码
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.contact_widget_row);
contactCursor.moveToPosition(position);
String contactName = contactCursor.getString(
contactCursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
rv.setTextViewText(R.id.text1, contactName);
String uriString = contactCursor.getString(
contactCursor.getColumnIndexOrThrow(ContactsContract.Contacts.PHOTO_URI));
if(uriString != null)
{
rv.setImageViewUri(R.id.image1, Uri.parse(uriString));
}
else
{
rv.setImageViewResource(R.id.image1, R.drawable.ic_contacts_holo_dark);
}
FWIW空URI的图像显示得很好,但不需要显示联系人的URI。
如何设置权限以在我的小部件中显示联系人照片?
答案 0 :(得分:0)
只是玩弄可能的解决方案,我找到了有效的方法。不要使用URI在RemoteViews中创建图像,而是使用URI创建一个Bitmap,然后使用它在RemoteViews中设置图像:
if(uriString != null)
{
//rv.setImageViewUri(R.id.image1, Uri.parse(uriString));
try
{
Bitmap bm = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), Uri.parse(uriString));
rv.setImageViewBitmap(R.id.image1, bm);
}
catch(Exception e)
{
rv.setImageViewResource(R.id.image1, R.drawable.ic_contacts_holo_dark);
}
}
else
{
rv.setImageViewResource(R.id.image1, R.drawable.ic_contacts_holo_dark);
}
catch块是因为Bitmap创建调用抛出FileNotFoundException和IOException。
我不知道为什么会这样,但确实如此。我猜是因为在创建Bitmap时(在我的包中具有READ_CONTACTS权限)从联系人的URI中读取图像,而不是启动器绘制窗口小部件(在我的包之外)。
我想在this link上给出答案,告诉我如何从URI创建位图。