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()
}
}
}