Skip to main content

Contacts (連絡先) アクセス

取得部分のコード

kt
private fun getContactNames() {
val cr = contentResolver
val c = cr.query(RawContacts.CONTENT_URI, null, null, null, RawContacts.SORT_KEY_PRIMARY)
if (c != null) {
val idxDisplayName = c.getColumnIndex(RawContacts.DISPLAY_NAME_PRIMARY)
val idxID = c.getColumnIndex(RawContacts._ID)

if (c.moveToFirst()) {
do {
Log.d("x", c.getString(idxDisplayName))
Log.d("x", c.getString(idxID))
} while (c.moveToNext())
}
c.close()
}
}

Permission 設定

Manifest - manifests/AndroidManifest.xml

xml
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<application...

Code

Permission 要求方法

kt
startPermissionRequest()
...
private fun startPermissionRequest() {
requestPermissionLauncher.launch(Manifest.permission.READ_CONTACTS)
}
val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
getContactNames()
} else {
Log.d("x", "NG")
}
}

古い書き方

kt
private val PERMISSIONS_REQUEST_READ_CONTACTS = 1 // 番号は なんでも良い? マイナスはダメぽい

private fun showContacts() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(
arrayOf<String>(Manifest.permission.READ_CONTACTS),
PERMISSIONS_REQUEST_READ_CONTACTS
)
} else {
getContactNames()
}
}

override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission is granted
showContacts()
} else {
Toast.makeText(
this,
"Until you grant the permission, we cannot display the names",
Toast.LENGTH_SHORT
).show()
}
}
}

Permission ないときのエラー

txt
Permission Denial:
opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord..
requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS