小部件中的权限拒绝
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 14 小部件不显示 NSLocationWhenInUseUsageDescription