我尝试提醒用户在退出活动时将数据保存在文件中。因此,我显示一个对话框,询问他们是否要存储数据。这里我需要检查是否授予了权限。如果没有,请请求它,一旦被授予,就写入文件。
我无法在 DialogFragment 中捕获 onRequestPermissionResult 回调,因此我开始使用新的 registerForActivityResult。问题是,当尚未授予权限时,弹出窗口会显示请求权限,但当授予权限时,不会调用回调。如果我再次按下关闭按钮,则会检查权限,并且回调现在会收到“已授予”,而不显示弹出窗口。
这是我在 DialogFragment 中的代码:
class SaveCalibrationDialogFragment(val data: String) : DialogFragment() {
private val activityResultLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()) { isGranted ->
println("Received CallBack")
if (isGranted) {
println("Permission granted!")
} else {
println("Permission needed!")
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(this.requireContext())
val dialog = builder.setTitle("Notice")
.setMessage("Data is not saved. Do you want to save before exiting?")
.setNegativeButton("No") { dialog, _ ->
}.setPositiveButton("Yes") { _, _ ->
activityResultLauncher?.launch(WRITE_EXTERNAL_STORAGE)
}
.create()
return dialog
}
}
活动:
cancel.setOnClickListener {
if (viewModel.isDataSave && viewModel.isLastPage) {
setResult(Activity.RESULT_OK, intent)
finish()
} else if (!viewModel.isDataSave && viewModel.isLastPage){
SaveCalibrationDialogFragment(viewModel.dataToSave!!).show(this.supportFragmentManager, "costumeSaveDialog")
} else {
setResult(Activity.RESULT_CANCELED, intent)
finish()
}
}
“问题是......当授予权限时,不会调用回调”
也许这就是为什么在调用“launch(...)”之前检查是否已授予权限是常见的原因。
Example
将回调存储在单独的变量中(myCallback
),然后更改为:
activityResultLauncher?.launch(WRITE_EXTERNAL_STORAGE)
变成这样的东西:
Activity activity = this;
String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
if (ContextCompat.checkSelfPermission(activity, permission)
== PackageManager.PERMISSION_GRANTED
) {
// Already granted permission.
myCallback.onActivityResult(true);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& activity.shouldShowRequestPermissionRationale(permission)
) {
// Permission denied permanently (by "Never ask again" checkbox).
myCallback.onActivityResult(false);
} else {
// At last, ask for permission.
activityResultLauncher?.launch(WRITE_EXTERNAL_STORAGE);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)