2012-07-06 74 views
2

我想创建一个联系人窗口小部件,显示与联系人的图片和名称的GridView,当按下视图时打开相应联系人的信息,但显示时显示权限拒绝小部件中的图片。权限拒绝在窗口小部件

首先,我刚创建了一个应用程序来测试显示GridViews和查询联系人。我提到了这一点,因为这意味着我必须包含正确的权限(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(?新星),而不是我的包名,以防万一。但我很困惑:该应用程序读取一切正常,并显示照片。小部件读取联系人的显示名称和查找URI很好,但是在尝试读取图片时会出现这些异常。有什么方法我应该为小部件添加额外的权限?

这里就是我创建了远程视窗,并添加信息

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

只是玩弄可能的解决方案,我发现有用的东西。而不是创建与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块是因为位图创建调用抛出FileNotFoundException异常和IOException异常。

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

我想在this link上给出答案,向我展示如何从URI创建位图。