2

我正在尝试创建一个联系人小部件,该小部件显示一个带有联系人图片和姓名的 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。

如何设置权限以在我的小部件中显示联系人照片?

4

1 回答 1

0

只是玩弄可能的解决方案,我发现了一些可行的方法。不要使用 URI 在 RemoteViews 中创建图像,而是使用 URI 创建位图,然后使用以下命令在 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。

我不知道为什么会这样,但确实如此。我猜是因为在创建位图时(在我的具有 READ_CONTACTS 权限的包内)从联系人中的 URI 读取图像,而不是在启动器绘制小部件时(在我的包外)。

我想感谢此链接上的答案,因为它向我展示了如何从 URI 创建位图。

于 2012-07-06T13:40:05.370 回答