API Результата Действия не возвращают обратный вызов для Контракта RequestPermission - PullRequest
0 голосов
/ 23 марта 2020

Я не получаю обратный вызов результата разрешения api Результата Действия, как упомянуто в do c.

Получение результата от действия

Я использую 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)
    }
}

В соответствии с do c, я должен получать обратный вызов внутри ActivityResultCallback, но после возврата я полагаю, что в моем случае он даже не вызывает функцию ParseResult. Хотя я все еще получаю обратный вызов внутри onRequestPermissionsResult функции.

Итак, я делаю что-то не так?

Пожалуйста, обратитесь Получение результата от действия , чтобы понять этот API .

Обновление

Мне удалось получить обратный вызов после расширения моей активности с помощью ComponentActivity, но снова, если разрешение уже дано, приложение не получит обратный вызов, есть ли способ напрямую обработать здесь? Я не хочу проверять свое разрешение.

Пример демонстрационного кода - https://github.com/tasneembohra/ActivityResultApiDemo

1 Ответ

0 голосов
/ 07 апреля 2020

Вот моя реализация, надеюсь, она поможет:

      val cameraPermission = prepareCall(ActivityResultContracts.RequestPermission()){
            if(it){
                Log.e("TAG", "permnission granted")
            }else{
                Log.e("TAG", "No permnission")
            }
        }

        cameraPermission(Manifest.permission.CAMERA)

Он входит в состояние «Предоставлено разрешение», если вы ранее предоставили разрешение и просто открыли приложение или предоставили его сейчас.

PS Мой Активность расширяется AppCompatActivity

...