android - Activity 结果 API 未返回 RequestPermission Contract 的回调

标签 android kotlin android-permissions

如文档中所述,我没有在 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/

相关文章:

android - 如何在 Kotlin 中从 Android "strings.xml"访问值

java - 应用程序请求未显示

android - 推送通知的最佳解决方案

android - 屏幕上剩余的自动完成文本

enums - 是否可以在 kotlin 中使用 enum ordinal 而不显式调用 ordinal?

java - 如何覆盖android中的权限管理器

java - 如果我使用移动数据而不是 wifi,Android 将无法运行

javascript - 将 SPA 从 elm 转换为 android 应用程序

android - 为什么在Android中不调用onReceive扩展BroadcastReceiver

kotlin - 如何将类型列表中的列表合并为单个不可变列表?