小部件中的权限拒绝

Posted

技术标签:

【中文标题】小部件中的权限拒绝【英文标题】:Permission Denial In Widget 【发布时间】:2012-07-06 13:36:58 【问题描述】:

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

只是尝试了一些可能的解决方案,我发现了一些可行的方法。不要使用 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 读取图像,而不是在启动器绘制小部件时(在我的包外)。

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

【讨论】:

以上是关于小部件中的权限拒绝的主要内容,如果未能解决你的问题,请参考以下文章

iOS Today 扩展/小部件——位置权限?

询问位置权限时,iOS 14 小部件不显示 NSLocationWhenInUseUsageDescription

用于内容的 Widget RemoteViewsFactory 中的 Android 权限拒绝

更改对菜单和小部件的角色访问权限

PHP 更改对菜单和窗口小部件的角色访问权限

如何从子小部件调用父小部件中的函数 |扑