Skip to main content

Activity Result APIがstableになったので使ってみた

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の戻りもやってみます
続くよ

関連記事:

Pocket