Activity Result API

Activity result API就是用來(lái)替換和擴(kuò)展老式的startActivityForResult的,同時(shí)還能用于動(dòng)態(tài)申請(qǐng)權(quán)限,當(dāng)然還能自定義,但我認(rèn)為前兩者足夠用了,所以沒(méi)有模擬自定義的情況。用到時(shí)在研究吧。通過(guò)看下面的代碼和注釋就知道了.
值得注意的是用這套api申請(qǐng)權(quán)限,別忘了在appManifest中聲明權(quán)限

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
package com.sky.testactivityresultapi

import android.Manifest
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts


class BlankFragment : Fragment() {
    private lateinit var textView: TextView

    /**
     * 這是最簡(jiǎn)單的使用方式,利用系統(tǒng)給定的ActivityResultContract
     * 就相當(dāng)于傳統(tǒng)的startActivityForResult
     * 目標(biāo)activity應(yīng)設(shè)定想要返回的intent
     * 在回調(diào)中通過(guò)it.data訪問(wèn)返回的intent得到相應(yīng)的值, 以及一個(gè)標(biāo)記it.resultCode
     */
    private val simpleTest =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            textView.text = "code:${it.resultCode}, data:${it.data?.getStringExtra("value")}"
        }

    /**
     * 測(cè)試申請(qǐng)一個(gè)權(quán)限
     * 我們例子中申請(qǐng)了一個(gè)訪問(wèn)通訊錄的權(quán)限,我們看到比傳統(tǒng)方式簡(jiǎn)單明了的多
     * 需要注意的是,該權(quán)限應(yīng)該在manifest清單文件中聲明
     */
    private val permissionOneTest =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { permissionGranted ->
            textView.text = permissionGranted.toString()
        }

    /**
     * 測(cè)試獲取通訊錄
     *
     */
    private val pickContact =
        registerForActivityResult(ActivityResultContracts.PickContact()){uri->
            textView.text = uri?.toString()
        }

    /**
     * 測(cè)試申請(qǐng)多個(gè)權(quán)限
     *
     */
    private val permissionMulti =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){retMap->
            retMap?.also {
                textView.text = it.toString()
            }
        }

    //用攝像機(jī)截圖并存儲(chǔ),這個(gè)比較復(fù)雜 懶得寫 真用到的時(shí)候在研究吧
    //https://stackoverflow.com/questions/65751435/activityresultcontracts-takepicture-returns-no-such-file-or-directory
    private val takePicture =
        registerForActivityResult(ActivityResultContracts.TakePicture()){

        }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false).also {
            textView = it!!.findViewById(R.id.textView)
            it.findViewById<Button>(R.id.button1)?.setOnClickListener {
                val intent = Intent(activity, DataActivity1::class.java).apply {
                    putExtra("arg", "zrm")
                }
                simpleTest.launch(intent)
            }

            //獲取單個(gè)權(quán)限
            it.findViewById<Button>(R.id.buttonOnePermission)?.setOnClickListener {
                permissionOneTest.launch(Manifest.permission.READ_CONTACTS)
            }

            //訪問(wèn)通訊錄
            it.findViewById<Button>(R.id.pickContact)?.setOnClickListener {
                pickContact.launch(null)
            }

            //獲取多個(gè)權(quán)限
            it.findViewById<Button>(R.id.buttonMulti)?.setOnClickListener {
                permissionMulti.launch(
                    arrayOf(
                        Manifest.permission.RECORD_AUDIO,
                        Manifest.permission.CAMERA,
                    )
                )
            }

            //和本主題無(wú)關(guān)的一個(gè)測(cè)試,啟動(dòng)其它app
            it.findViewById<Button>(R.id.buttonStartup)?.setOnClickListener {
                val to = Intent(Intent.ACTION_VIEW,
                    Uri.parse("zrm://bony.zhu.com/main?arg1=100&arg2=hero"))
                startActivity(to)
            }
        }
    }
}
package com.sky.testactivityresultapi

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class DataActivity1 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_data1)

        findViewById<TextView>(R.id.textViewArg).text = intent.getStringExtra("arg")
        findViewById<Button>(R.id.buttonOk).setOnClickListener {
            setResult(Activity.RESULT_OK, Intent().putExtra("value", "I am back!"))
            finish()
        }
        findViewById<Button>(R.id.buttonCancel).setOnClickListener {
            setResult(Activity.RESULT_CANCELED, Intent().putExtra("value", "I am canceled!"))
            finish()
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容