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を入れてみた