Index
ストレージ アクセス フレームワーク(SAF)を採用しています。SAF を利用することで、ユーザーは希望するドキュメント ストレージ プロバイダ全体を通じて簡単にドキュメント、画像などのファイルを参照して開くことができます。標準の使いやすい UI により、アプリやプロバイダを通じて一貫性のある方法でファイルを参照したり、最近使用したファイルにアクセスしたりできます。
android developers
詳細は公式サイトを見てください。
https://developer.android.com/guide/topics/providers/document-provider.html?hl=ja
ボタンを押下すると、SAFを通して画像を選択できるようになります。
選択した画像をimageViewで表示する簡単なアプリです。
ImageViewとButtonのみを配置した簡単なUIです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="wrap_content" android:contentDescription="SAFで選択された画像を表示" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="select Image" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/imageView" /> </androidx.constraintlayout.widget.ConstraintLayout> |
このクラスでポイントになるのは、以下の二つです。
- resultLauncher:SAFで選択された画像を処理するコードが記載されている
- showSAF():SAFを表示するクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package com.example.safsample import android.content.Intent import android.net.Uri import android.os.Bundle import android.widget.ImageView import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.appcompat.app.AppCompatActivity import com.example.safsample.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private val resultLauncher = registerForActivityResult( StartActivityForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK) { //SAFで選択された画像をImageViewに表示する処理 val resultData = result.data if (resultData != null) { val uri: Uri? = resultData.data val imageView = findViewById<ImageView>(R.id.imageView) imageView.setImageURI(uri) } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) binding.button.setOnClickListener{ showSAF() } } private fun showSAF(){ val intent = Intent() intent.type = "image/*"//SAFで選択できるファイルを画像のみに絞る intent.action = Intent.ACTION_OPEN_DOCUMENT//ユーザーは特定のドキュメントやファイルを選択して開くことができます。 resultLauncher.launch(intent) } } |
サンプルコードはgitで公開していますので、適宜参照してください!