最初にいくつかの情報:
私は最初に Cordova でアプリを作成しました: Cordova のアクセス許可には android.permission.READ_CONTACTS または grantUriPermission() が必要を参照してください。
Android Studio Builder を使用してネイティブ Android アプリとしてアプリを作成したところ、同じエラーが発生しました。
Android 6.0 (SDK 23) を使用しています
ドキュメントによると、ContactPick はパーミッションを必要としません: http://developer.android.com/guide/components/intents-common.html#Contacts
The result Intent delivered to your onActivityResult() callback contains the content: URI pointing to the selected contact. The response grants your app temporary permissions to read that contact using the Contacts Provider API even if your app does not include the READ_CONTACTS permission.
(しかし、それでも私はそれを宣言しました)
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="me.sapico.notify_arrival">
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" />
<uses-permission-sdk-23 android:name="android.permission.READ_CONTACTS" />
<uses-permission-sdk-23 android:name="android.permission.LOCATION_HARDWARE" />
<uses-permission-sdk-23 android:name="android.permission.INTERNET" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
これが私のコードです(ListViewのクリックを使用します)
listView1.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapter, View v, int position,
long arg3)
{
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_CONTACT);
}
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
String phone = getNumberContacts(data);
String t = "";
/* Uri contactUri = data.getData();
String[] projection = {};//ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
Cursor cursor = getContentResolver().query(contactUri, projection,
null, null, null);
// If the cursor returned is valid, get the phone number
if (cursor != null && cursor.moveToFirst()) {
int numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(numberIndex);
// Do something with the phone number
//...
}*/
}
}
ここにスタックトレースがあります
11-05 01:47:17.008 26632-26688/me.sapico.notify_arrival E/Surface: getSlotFromBufferLocked: unknown buffer: 0xaefbd3e0
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: FATAL EXCEPTION: main
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: Process: me.sapico.notify_arrival, PID: 26632
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/258i49688c038aae982f.3789r2248-292F313F3943312F31533F4545/897 flg=0x1 }} to activity {me.sapico.notify_arrival/me.sapico.notify_arrival.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/data/phones from pid=26632, uid=10149 requires android.permission.READ_CONTACTS, or grantUriPermission()
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.-wrap16(ActivityThread.java)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/data/phones from pid=26632, uid=10149 requires android.permission.READ_CONTACTS, or grantUriPermission()
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1599)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.content.ContentResolver.query(ContentResolver.java:491)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.content.ContentResolver.query(ContentResolver.java:434)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at me.sapico.notify_arrival.MainActivity.getNumberContacts(MainActivity.java:200)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at me.sapico.notify_arrival.MainActivity.onActivityResult(MainActivity.java:175)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.Activity.dispatchActivityResult(Activity.java:6428)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.-wrap16(ActivityThread.java)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-05 01:47:19.260 26632-26632/me.sapico.notify_arrival E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
許可/電話情報の要求には多くのバリエーションがありました。番号を取得しようとすると、ほとんど失敗します..(ユーザー名の取得に一度成功しました)。
何かご意見は?私のCordovaアプリにもありますが(以前はCordovaだと思っていました)、ネイティブAndroidにもあります。Android 6.0が最近新しくなったことは知っていますが、ドキュメント/スタックオーバーフローには何も見つかりません。