我正在嘗試在我的 android 上使用相機。將提示用戶獲得相機的許可。以前我為他們使用了 startActivityForResult 和 onRequestPermissionRequest。最近我發現它們已被棄用,所以我正在嘗試使用 registerForActivity。我設法更改為 startActivity 但我被困在權限請求中。我想知道我是否必須創建另一個權限啟動器,或者我可以在我的結果啟動器中執行權限。
companion object{
private const val CAMERA_PERMISSION_CODE = 1
private const val CAMERA_REQUEST_CODE = 2
}
val checkpermission = Manifest.permission.CAMERA
var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Intent? = result.data
val DP: Bitmap = data!!.extras!!.get("data") as Bitmap
val image = findViewById<ImageView>(R.id.imageButtonVerifyPhoto)
image.setImageBitmap(DP)
}
}
val permissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()){
isGranted ->
if(isGranted){
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
resultLauncher.launch((intent))
Toast.makeText(this,"Permission is tested", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(this,"Permission is denied",Toast.LENGTH_SHORT).show()
}
}
var cameraButton = findViewById<Button>(R.id.buttonRetakePhoto) // can change later
cameraButton.setOnClickListener {
if(ContextCompat.checkSelfPermission(
this,
checkpermission
) == PackageManager.PERMISSION_GRANTED
){
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
resultLauncher.launch(intent)
}else{
permissionLauncher.launch(checkpermission)
}
}
}
下面是我之前的 onRequestPermission 代碼
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if(requestCode == CAMERA_REQUEST_CODE){
if(grantResults.isNotEmpty()&& grantResults[0] == PackageManager.PERMISSION_GRANTED){
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, CAMERA_REQUEST_CODE)
}else{
Toast.makeText(this,"Permission is denied",Toast.LENGTH_SHORT).show()
}
}
}
uj5u.com熱心網友回復:
2022 年最新解決方案:(不再有請求代碼)
創建輔助擴展函式(用于
Fragment):fun Fragment.requestPermissions(request: ActivityResultLauncher<Array<String>>, permissions: Array<String>) = request.launch(permissions) fun Fragment.isAllPermissionsGranted(permissions: Array<String>) = permissions.all { ContextCompat.checkSelfPermission(requireContext(), it) == PackageManager.PERMISSION_GRANTED }請求權限
Fragment:class FirstFragment : Fragment() { companion object { private val PERMISSIONS = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION) } private lateinit var binding: FragmentFirstBinding private lateinit var permissionsRequest: ActivityResultLauncher<Array<String>> override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_first, container, false) permissionsRequest = getPermissionsRequest() binding.grantButton.setOnClickListener { requestPermissions(permissionsRequest, PERMISSIONS) //extension function } return binding.root } private fun getPermissionsRequest() = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { if (isAllPermissionsGranted(PERMISSIONS)) { //extension function //do your stuff } else { //do your stuff } } }
uj5u.com熱心網友回復:
請求運行時權限只是稍微簡化了一點
private val requestPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
// do something
}
現在我們可以呼叫它來獲得你想要的任何型別的權限
cameraButton.setOnClickListener {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
// Pass any permission you want while launching
requestPermission.launch(Manifest.permission.CAMERA)
}
}
確保添加build.gradle
implementation 'androidx.fragment:fragment-ktx:1.2.0' // or later
implementation 'androidx.activity:activity-ktx:1.3.0' // or later
如果你想了解這一切是如何作業的,請查看這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/443740.html
