Android 共有ストレージアクセス


アクセス権限の確認 & 取得

ダイアログで権限の許可 or 拒否の操作完了時にonRequestPermissionsResult()がコールバックされる。

fun accessStorage(){
    if(ContextCompat.checkSelfPermission(
        activity!!, Manifest.permission.READ_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED )
    {
        //権限あり
        readExternalStorage()
        return
    }
    //権限なし
    if(shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)){
        //拒否済み
    }
    //権限許可確認ダイアログ
    requestPermissions( arrayOf<String>(Manifest.permission.READ_EXTERNAL_STORAGE), 2 )
}

共有ストレージのアクセス

暗黙インテントを送信する。ストレージから戻ってきた時にonActivityResult()がコールバックされる

private fun readExternalStorage() {
    val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    intent.setType("image/*")
    startActivityForResult(Intent.createChooser(intent,"Title"), 1)
}

権限要求結果

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    if(requestCode != 2){return}
    if(grantResults.size != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED){
        //要求拒否
        return
    }
    //ストレージアクセス
    readExternalStorage()
}

ストレージから戻ってきた時の処理

この例では保存されている画像を選択された時を想定 data:Intent?の中に選択されたファイル情報が入ってくるので、ファイルに対する処理を記述する

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
     super.onActivityResult(requestCode, resultCode, data)

     if(requestCode != 1 ) {return}
     if(resultCode != RESULT_OK){return}
     //選択なし
     if(data == null){return}

     data.data?.let { uri ->
         //選択された画像に対する処理
     }