rokkonet

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

android開発 外部ストレージのアプリ固有領域のパス取得

2021 Aug. 09.
2021 Jun. 20.


インストール端末
androidバージョン7(APIレベル24)
androidバージョン10(APIレベル29)


compileSdkVersion 29
minSdkVersion 24
targetSdkVersion 29

AndroidManifest.xml

ファイルアクセスパーミッション設定は、Androidバージョン9(APIレベル28)までは必要だが、バージョン10(APIレベル29)以降は必要ない。

次の設定を要する。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />

サンプル

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="PACKAGE.PROJECT">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                     android:maxSdkVersion="28" />
    <application

    </application>
</manifest>


kotlinコード

context.getExternalFilesDirs(null) を使う

サンプル

class MainActivity : AppCompatActivity() {

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

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

        binding.btnGetSDPath.setOnClickListener {  // btnGetSDPath: Button View
            val listStrPaths: List<String>?
            listStrPaths = getSdCardFilesDirPathListForLollipop(this)
            var strPaths = ""
            for (eachPath in listStrPaths) {
                strPaths = "$strPaths $eachPath"
            }
            binding.TVPaths.text = strPaths  // TVPaths: Text View
        }
    }


    /**
     * https://rasumus.hatenablog.com/entry/2021/06/13/182210 より。
     * SDカードのfilesディレクトリパスのリストを取得する。
     * Android5.0以上対応。
     *
     * @param context
     * @return SDカードのfilesディレクトリパスのリスト
     */
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    fun getSdCardFilesDirPathListForLollipop(context: Context): List<String> {
        val sdCardFilesDirPathList: MutableList<String> = ArrayList()

        // getExternalFilesDirsはAndroid4.4から利用できるAPI。
        // Externalfilesディレクトリのリストを取得できる。
        val dirArr: Array<File> = context.getExternalFilesDirs(null)
        for (dir in dirArr) {
                val path: String = dir.absolutePath

                // isExternalStorageRemovableはAndroid5.0から利用できるAPI。
                // 取り外し可能かどうか(SDカードかどうか)を判定している。
                if (Environment.isExternalStorageRemovable(dir)) {
                    // 取り外し可能であればSDカード。
                    if (!sdCardFilesDirPathList.contains(path)) {
                        sdCardFilesDirPathList.add(path)
                    }
                } else {
                    // 取り外し不可能であれば内部ストレージ。
                    continue
                }
        }
        return sdCardFilesDirPathList
    }
}