3

アプリがREAD_CONTACTS権限を必要とせずに、ユーザーが連絡先を選択できるようにするために、Androidの連絡先ピッカーを実験してきました。次のインテントは、4.0(ICS)デバイスと2.3.3エミュレーターで機能するようです。

Intent contactPickerIntent = new Intent(Intent.ACION_GET_CONTENT);
contactPickerIntent.setType(Phone.CONTENT_ITEM_TYPE); // returns content://com.android.contacts/data/...

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); // returns content://com.android.contacts/lookup/...

ただし、2.2エミュレーターおよび特定のプレICSモデル(HTC Thunderbolt、Motorola Droidなど)では、返されたUIをクエリしようとすると、アクセス許可拒否の例外が発生します。

原因:java.lang.SecurityException:許可拒否:com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts/lookup/0r1-52345052324E483C32/1 from pid = 273、uid = 10036 android.permission.READ_CONTACTSが必要です

これは、OSまたはデバイスの断片化の問題のようです。このトピックまたは別のアプローチを進めることができるように、このトピックについての説明を求めています。

考え?

4

1 に答える 1

1

これは意図的なものです。このページの下部に、この動作が文書化されています。

Android 2.3 (API レベル 9) より前では、連絡先プロバイダー (上記のような) でクエリを実行するには、アプリでパーミッションを宣言する必要がありますREAD_CONTACTS(セキュリティとパーミッションを参照)。ただし、Android 2.3 以降では、Contacts/People アプリは、結果が返されたときに連絡先プロバイダーから読み取るための一時的なアクセス許可をアプリに付与します。Uri一時的なアクセス許可は、要求された特定の連絡先にのみ適用されるため、アクセス許可を宣言しない限り、インテントで指定された連絡先以外の連絡先を照会することはできませんREAD_CONTACTS

これが文書化されていると思われる場所は他にもたくさんありますが、そのページは私が見つけた唯一の場所です。

于 2015-01-27T22:22:11.383 に答える