rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 外部ストレージの共有領域のメディアファイルの読み込み

2021 Jul. 06.
2021 Jul. 04.

MediaStoreを利用して外部ストレージの共有領域のメディアファイル(audio video image)を読み込む


外部ストレージにユーザーが作成した任意のディレクトリ内に保存されたメディアファイルを読み込み可能

確認端末

android 7
android 10

コンパイル環境

compileSdkVersion 30
minSdkVersion 24
targetSdkVersion 30

パーミッション

READ_EXTERNAL_STORAGEを要する

AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

パーミッション取得

  • アプリの初回利用時にREAD_EXTERNAL_STORAGEの取得状況を確認する

   ActivityCompat.checkSelfPermission()

   requestPermissions()

kotlinコード

MainActivity.kt

class MainActivity : AppCompatActivity() {

    val PERMISSION_READ_EX_STR: Int = 100

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btnGetSDPath.setOnClickListener {
            getExternalImageFiles()
        }
    }

    fun getExternalImageFiles() {
        Log.d("MyApp", "Tapped to getExternalImageFiles.")

        // アプリに権限が付与されているかどうかを確認する
        if (Build.VERSION.SDK_INT >= 23) {
            if (ActivityCompat.checkSelfPermission(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED ) {
                Log.d("MyApp", "permission.READ_EXTERNAL_STORAGE is not granted.")
                requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_READ_EX_STR)
            } else {
                Log.d("MyApp", "permission.READ_EXTERNAL_STORAGE is granted.")
                readExMedia()
            }
        } else {
            Log.d("MyApp", "permission.READ_EXTERNAL_STORAGE is granted.")
            readExMedia()
        }
    }


    override fun onRequestPermissionsResult(
            requestCode: Int, permission: Array<String>,
            grantResults: IntArray) {

        Log.d("MyApp", "onRequestPermissionsResult.")

        if (grantResults.size <= 0) {
            return
        }
        when (requestCode) {
            PERMISSION_READ_EX_STR -> {
                run {
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // 許可が取れた場合
                        readExMedia()
                    } else {
                        // 許可が取れなかった場合
                        Toast.makeText(
                            this,
                            "パーミッションを取得できません", Toast.LENGTH_LONG
                        ).show()
                    }
                }
                return
            }
        }
    }

    fun readExMedia() {
        val columns = arrayOf(
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DISPLAY_NAME,
        )

        Log.d("MyApp","URI: " + MediaStore.Images.Media.EXTERNAL_CONTENT_URI)

        val resolver = applicationContext.contentResolver
        val cursor = resolver.query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  //データの種類
            columns, //取得する項目 nullは全部
            null, //フィルター条件 nullはフィルタリング無し
            null, //フィルター用のパラメータ
            null   //並べ替え
        )
        Log.d( "MyApp" , Arrays.toString( cursor?.getColumnNames() ) )  //項目名の一覧を出力
        val numCount: Int? = cursor?.count
        Log.d("MyApp","Num raws : " + numCount)

        cursor?.use {
            val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
            val displayNameColumn =
                cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)
            while (cursor.moveToNext()) {
                val id = cursor.getLong(idColumn)
                val displayName = cursor.getString(displayNameColumn)
                val contentUri = Uri.withAppendedPath(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    id.toString()
                )
                Log.d(
                    "MyApp", "id: $id, name: $displayName, uri: $contentUri"
                )
            }
        }
    }
}