Activity Result APIが入ったandroidxがstableになりました
onActivityResultが辛すぎるので試しに使ってみた
・設定
implementation "androidx.activity:activity-ktx:1.2.0" implementation "androidx.fragment:fragment-ktx:1.3.0"
・画像を取得
private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> Toast.makeText(this, uri?.toString() ?: "empty", Toast.LENGTH_LONG).show() } //実行 getContent.launch("image/*")
・説明
メソッドの実行はlaunchになった模様
https://zenn.dev/t2low/articles/ea610398e29154e1a887
ActivityResultContractsで定義されたやつをコールバックで取得できるようになった
色々な暗黙的intentが定義されてる
・カメラで撮影
ついでにカメラで撮影をやってみた
private val getPicture = registerForActivityResult(ActivityResultContracts.TakePicture()) { Toast.makeText(this, it.toString(), Toast.LENGTH_LONG).show() } //実行 val imagePath = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "external_files") val newFile = File(imagePath, "default_image.jpg") val uri = getUriForFile( applicationContext, BuildConfig.APPLICATION_ID + ".provider", newFile ) getPicture.launch(uri)
AndroidManifest
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
xml/provider_paths.xml
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="." /> </paths>
・説明
Android7からFileProviderを使う
そして、getUriForFileの第二引数はproviderで定義した値を使う必要がある
使わないと以下のエラーが出る
Couldn’t find meta-data for provider with authority
https://stackoverflow.com/questions/56598480/couldnt-find-meta-data-for-provider-with-authority
external-pathは外部ストレージで共有
https://developer.android.com/training/secure-file-sharing/setup-sharing?hl=ja
外部ストレージは以下で取得
getExternalFilesDir
res/xml/provider_paths.xmlとコード上の関係はここにまとまってるので参考になる
https://azunobu.hatenablog.com/entry/2019/06/27/120908
これでonActivityResultを消し去ることができましたとさ
次は自分が定義したAcitivtyの戻りもやってみます
続くよ
関連記事:
- Activity Result APIを使ってカスタムコントラクトを作成する
- com.google.firebase:firebase-adsを上げるとtarget SDKバージョンによってエラーになる
- JetpackComposeにNavigationを入れてみた