2012-07-06 52 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創建位圖。