2

ビューが押されたときに適切な連絡先の情報を開いて、連絡先の写真と名前を含む 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);
}

null URI の画像は問題なく表示されますが、連絡先から URI を表示する必要はありません。

ウィジェットに連絡先の写真を表示するには、どのように権限を設定する必要がありますか?

4

1 に答える 1

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 ブロックは、Bitmap 作成呼び出しが FileNotFoundException と IOException をスローするためです。

なぜこれが機能するのかわかりませんが、機能します。ランチャーがウィジェットを描画するとき (パッケージの外側) とは対照的に、ビットマップを作成するとき (READ_CONTACTS 権限を持つパッケージの内側) に画像が連絡先の URI から読み取られるためだと思います。

URI からビットマップを作成する方法を示してくれたこのリンクの回答に感謝したいと思います。

于 2012-07-06T13:40:05.370 に答える