Widget中的权限拒绝

时间:2012-07-06 05:32:28

标签: android permissions android-widget

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

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

1 个答案:

答案 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创建位图。