如文档中所述,我没有在 Activity Result api 上获得权限结果回调。
Getting a result from an activity
我正在使用 implementation "androidx.activity:activity-ktx:1.2.0-alpha02"
这是api代码:
/**
* An {@link ActivityResultContract} to {@link Activity#requestPermissions request a permission}
*/
public static class RequestPermission extends ActivityResultContract<String, Boolean> {
@NonNull
@Override
public Intent createIntent(@NonNull String input) {
return new Intent(ACTION_REQUEST_PERMISSIONS)
.putExtra(EXTRA_PERMISSIONS, new String[] { input });
}
@NonNull
@Override
public Boolean parseResult(int resultCode, @Nullable Intent intent) {
if (resultCode != Activity.RESULT_OK) return false;
if (intent == null) return false;
int[] grantResults = intent.getIntArrayExtra(EXTRA_PERMISSION_GRANT_RESULTS);
if (grantResults == null) return false;
return grantResults[0] == PackageManager.PERMISSION_GRANTED;
}
}
这是我的实现:
private val permission = prepareCall(object : ActivityResultContracts.RequestPermission() {
override fun createIntent(input: String): Intent {
if (shouldShowRequestPermissionRationale(input)) {
Toast.makeText(
this@MainActivity,
"shouldShowRequestPermissionRationale - true",
Toast.LENGTH_SHORT
).show()
// case 2
} else {
Toast.makeText(
this@MainActivity,
"shouldShowRequestPermissionRationale - false",
Toast.LENGTH_SHORT
).show()
// case 1 and 3
}
return super.createIntent(input)
}
override fun parseResult(resultCode: Int, intent: Intent?): Boolean {
val t = super.parseResult(resultCode, intent)
Toast.makeText(this@MainActivity, "parseResult $t", Toast.LENGTH_SHORT).show()
return t
}
}) {
Log.d("permission granted?", "$it")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
permission(android.Manifest.permission.CAMERA)
}
}
根据文档,我应该在
ActivityResultCallback
内获得回调但在我的情况下,回溯后,它甚至不调用 ParseResult
功能。虽然我仍然在 onRequestPermissionsResult
内收到回调功能。那么,我做错了吗?
请引用 Getting a result from an activity理解这个api。
更新
在使用
ComponentActivity
扩展我的 Activity 后,我能够获得回调但是同样,如果已经授予权限,那么应用程序将不会收到回调,有没有办法直接在这里处理?我不想检查自我许可。示例演示代码 - https://github.com/tasneembohra/ActivityResultApiDemo
最佳答案
这是我的实现,希望对您有所帮助:
val cameraPermission = prepareCall(ActivityResultContracts.RequestPermission()){
if(it){
Log.e("TAG", "permnission granted")
}else{
Log.e("TAG", "No permnission")
}
}
cameraPermission(Manifest.permission.CAMERA)
如果您之前授予权限并且只是打开应用程序,它会进入 Permission Granted 条件,或者现在授予它。
附言我的 Activity 延长 AppCompatActivity
关于android - Activity 结果 API 未返回 RequestPermission Contract 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60819643/