質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

3160閲覧

Android開発 contentResolver、MediaStoreによる外部ストレージの共有ファイルへのアクセス

rasum

総合スコア21

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2021/06/27 04:10

Android 10端末にインストールするandroid開発において、contentResolver、MediaStoreを使って外部ストレージの共有ファイルにアクセスしようとしています。
以下を行いましたが、うまくいきません。
どこが間違っているのかお教えください。

  1. Android 10の端末にて、「内部記憶への保存」と「外部記憶への保存」を設定できるカメラアプリを使って、"外部SDカード/DCIM/Camera/"以下に写真を2枚保存。

"外部SDカード/DCIM/Camera"はカメラアプリが自動的に作成し、保存ディレクトリを選択できない。

  1. 下記のコードのアプリを作成。

画面上のbtnGetMediaボタンをタップしたら、contentResolverが見つけたMediaStore.Images.Media.EXTERNAL_CONTENT_URIの数をLogcatに出力するようにした(つもり)。

  1. 上記のアプリをAndroid 10端末上で実行しても、MediaStore.Images.Media.EXTERNAL_CONTENT_URIの取得数が0(ゼロ)となる。

〈コード〉
build.gradle(:app)

android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { minSdkVersion 24 targetSdkVersion 30 } }

AndroidManifest.xml

xml

1<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 2 android:maxSdkVersion="28" /> 3<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

MainActivity.kt

kotlin

1class MainActivity : AppCompatActivity() { 2 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState) 5 6 val binding = ActivityMainBinding.inflate(layoutInflater) 7 setContentView(binding.root) 8 9 binding.btnGetMedia.setOnClickListener { 10 getExternalImages() 11 } 12 } 13 14 fun getExternalImages() { 15 Log.d("MyApp", "Tapped to getExternalImageFiles.") 16 17 val resolver = this.applicationContext.contentResolver 18 val cursor = resolver.query( 19 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 20 null, 21 null, 22 null, 23 null 24 ) 25 Log.d( "MyApp" , Arrays.toString( cursor?.getColumnNames() ) ) 26 val numCount: Int? = cursor?.count 27 Log.d("MyApp","Num raws : " + numCount) 28 }

<Logcat出力>

2021-06-27 12:39:02.207 D/MyApp: Tapped to getExternalImageFiles. 2021-06-27 12:39:02.233 D/MyApp: [instance_id, duration, description, picasa_id, latitude, orientation, height, is_drm, bucket_display_name, owner_package_name, volume_name, date_modified, date_expires, _display_name, datetaken, mime_type, _id, _data, _hash, _size, title, width, longitude, is_trashed, group_id, document_id, is_pending, date_added, mini_thumb_magic, primary_directory, secondary_directory, isprivate, original_document_id, bucket_id, relative_path] 2021-06-27 12:39:02.233 D/MyApp: Num raws : 0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

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

投稿2021/07/03 03:10

rasum

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問