Android API 23以降のDangerous Permissionの許可手順を踏んでいませんでした。
以下のコードで content://media/external/images/media/以下の画像ファイルを得られました。
〈コード〉
AndroidManifest.xml
xml
1<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
MainActivity.kt
kotlin
1class MainActivity : AppCompatActivity() {
2
3 val PERMISSION_READ_EX_STR: Int = 100
4
5 override fun onCreate(savedInstanceState: Bundle?) {
6 super.onCreate(savedInstanceState)
7
8 val binding = ActivityMainBinding.inflate(layoutInflater)
9 setContentView(binding.root)
10
11 binding.btnGetSDPath.setOnClickListener {
12 getExternalImageFiles()
13 }
14 }
15
16
17 fun getExternalImageFiles() {
18
19 Log.d("MyApp", "Tapped to getExternalImageFiles1.")
20
21 // アプリに権限があるか
22 if (Build.VERSION.SDK_INT >= 23) {
23 if (ActivityCompat.checkSelfPermission(this,
24 Manifest.permission.READ_EXTERNAL_STORAGE)
25 != PackageManager.PERMISSION_GRANTED ) {
26 Log.d("MyApp", "permission.READ_EXTERNAL_STORAGE is not granted.")
27 requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_READ_EX_STR)
28 } else {
29 Log.d("MyApp", "permission.READ_EXTERNAL_STORAGE is granted.")
30 readExMedia()
31 }
32 } else {
33 Log.d("MyApp", "permission.READ_EXTERNAL_STORAGE is granted.")
34 readExMedia()
35 }
36 }
37
38
39 override fun onRequestPermissionsResult(
40 requestCode: Int, permission: Array<String>,
41 grantResults: IntArray) {
42
43 Log.d("MyApp", "onRequestPermissionsResult.")
44
45 if (grantResults.size <= 0) {
46 return
47 }
48 when (requestCode) {
49 PERMISSION_READ_EX_STR -> {
50 run {
51 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
52 // 権限を取得できた場合
53 readExMedia()
54 } else {
55 // 権限を取得できなかった場合
56 Toast.makeText(
57 this,
58 "パーミッションを取得できません", Toast.LENGTH_LONG
59 ).show()
60 }
61 }
62 return
63 }
64 }
65 }
66
67
68 fun readExMedia() {
69 val columns = arrayOf( //取得する項目
70 MediaStore.Images.Media._ID,
71 MediaStore.Images.Media.DISPLAY_NAME,
72 )
73
74 Log.d("MyApp","URI: " + MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
75
76 val resolver = applicationContext.contentResolver
77 val cursor = resolver.query(
78 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
79 columns,
80 null, //フィルター条件 nullはフィルタリング無し
81 null, //フィルター用のパラメータ
82 null //並べ替え
83 )
84 Log.d( "MyApp" , Arrays.toString( cursor?.getColumnNames() ) ) //項目名の一覧を表示
85 val numCount: Int? = cursor?.count
86 Log.d("MyApp","Num raws : " + numCount)
87
88 cursor?.use {
89 val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
90 val displayNameColumn =
91 cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)
92 while (cursor.moveToNext()) {
93 val id = cursor.getLong(idColumn)
94 val displayName = cursor.getString(displayNameColumn)
95 val contentUri = Uri.withAppendedPath(
96 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
97 id.toString()
98 )
99 Log.d(
100 "MyApp", "id: $id, name: $displayName, uri: $contentUri"
101 )
102 }
103 }
104 }
105}
<Logcat出力>
(アプリのインストール直後、1回目のメディア検索)
2021-07-03 11:36:15.752 PROJECT D/MyApp: Tapped to getExternalImageFiles1.
2021-07-03 11:36:15.752 PROJECT D/MyApp: permission.READ_EXTERNAL_STORAGE is not granted.
2021-07-03 11:36:21.777 PROJECT D/MyApp: onRequestPermissionsResult.
2021-07-03 11:36:21.778 PROJECT D/MyApp: URI: content://media/external/images/media
2021-07-03 11:36:21.845 PROJECT D/MyApp: [_id, _display_name]
2021-07-03 11:36:21.845 PROJECT D/MyApp: Num raws : 5
2021-07-03 11:36:21.845 PROJECT D/MyApp: id: 61, name: 5824.jpg, uri: content://media/external/images/media/61
2021-07-03 11:36:21.846 PROJECT D/MyApp: id: 31, name: 4657.jpg, uri: content://media/external/images/media/31
2021-07-03 11:36:21.846 PROJECT D/MyApp: id: 33, name: 5218.jpg, uri: content://media/external/images/media/33
2021-07-03 11:36:21.846 PROJECT D/MyApp: id: 34, name: 5328.jpg, uri: content://media/external/images/media/34
2021-07-03 11:36:21.846 PROJECT D/MyApp: id: 35, name: 5356.jpg, uri: content://media/external/images/media/35
(2回目のメディア検索)
2021-07-03 11:36:28.352 PROJECT D/MyApp: Tapped to getExternalImageFiles1.
2021-07-03 11:36:28.353 PROJECT D/MyApp: permission.READ_EXTERNAL_STORAGE is granted.
2021-07-03 11:36:28.353 PROJECT D/MyApp: URI: content://media/external/images/media
2021-07-03 11:36:28.376 PROJECT D/MyApp: [_id, _display_name]
2021-07-03 11:36:28.377 PROJECT D/MyApp: Num raws : 5
2021-07-03 11:36:28.377 PROJECT D/MyApp: id: 61, name: 5824.jpg, uri: content://media/external/images/media/61
2021-07-03 11:36:28.377 PROJECT D/MyApp: id: 31, name: 4657.jpg, uri: content://media/external/images/media/31
2021-07-03 11:36:28.378 PROJECT D/MyApp: id: 33, name: 5218.jpg, uri: content://media/external/images/media/33
2021-07-03 11:36:28.378 PROJECT D/MyApp: id: 34, name: 5328.jpg, uri: content://media/external/images/media/34
2021-07-03 11:36:28.378 PROJECT D/MyApp: id: 35, name: 5356.jpg, uri: content://media/external/images/media/35
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。