1
私は連絡先を読むことができましたが、私は連絡先を書くだけでなく読みたいと思います。誰も私がこれらの2つのタスクを行うことができる方法をアドバイスしてもらえますか? エラーメッセージ。連絡先の読み取りと書き込みのアクセス許可
READ_CONTACTSについては、私のコードを参照してください。WRITE_CONTACTSにも展開したいと思います。
// Called when the user is performing an action which requires the app to read the
// user's contacts
public void getPermissionToReadUserContacts() {
// 1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid
// checking the build version since Context.checkSelfPermission(...) is only available
// in Marshmallow
// 2) Always check for permission (even if permission has already been granted)
// since the user can revoke permissions at any time through Settings
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// The permission is NOT already granted.
// Check if the user has been asked about this permission already and denied
// it. If so, we want to give more explanation about why the permission is needed.
if (shouldShowRequestPermissionRationale(
Manifest.permission.READ_CONTACTS)) {
// Show our own UI to explain to the user why we need to read the contacts
// before actually requesting the permission and showing the default UI
}
// Fire off an async request to actually get the permission
// This will show the standard permission request dialog UI
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
READ_CONTACTS_PERMISSIONS_REQUEST);
}
}
// Callback with the request from calling requestPermissions(...)
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String permissions[],
@NonNull int[] grantResults) {
// Make sure it's our original READ_CONTACTS request
if (requestCode == READ_CONTACTS_PERMISSIONS_REQUEST) {
if (grantResults.length == 1 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Read Contacts permission granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Read Contacts permission denied", Toast.LENGTH_SHORT).show();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
ContentResolver reContentResolverol = getContentResolver();
Uri contactData = data.getData();
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(contactData, null, null, null, null);
cursor.moveToFirst();
String username = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = reContentResolverol.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId,
null,
null);
while (phone.moveToNext()) {
String usernumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phone1.setText(usernumber);
name1.setText(username);
}
}
}
}
https://developer.android.com/training/permissions/requesting.html – yanivtwin
@ElderlyWatch:最も簡単な解決策は、戦略的には、(通常は 'app/build.gradle'の)' targetSdkVersion'を変更することですランタイムのアクセス権を処理する必要はありません。それ以外に、**あなたが理解していないことを、**あなたが説明しない限り、私はあなたに助言することはできません。 – CommonsWare
@ElderlyWatch:「WRITE_CALENDAR」はあなたが望むものではありません。アクセス許可が必要なAPIを使用する前に、実行時アクセス許可をチェックし、要求する必要があります。パーミッションを要求するとダイアログが表示され、非同期で結果が返されるため、あなたの質問に表示される 'onActivityResult()'をトリガする 'startActivityForResult()'コールを行う前にそれをしたいかもしれません。 – CommonsWare