Как запросить разрешения местоположения в Android 10 во второй раз после того, как пользователь отключит их? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть приложение Bluetooth в Android 10, и прежде чем я смогу начать поиск устройств, мне нужно запросить разрешения для определения местоположения. Когда я устанавливаю приложение в первый раз, я получаю всплывающее окно с указанием местоположения, но после этого, если я отключу их, оно не будет спрашивать снова, и мне нужно попросить пользователя включить их каждый раз, когда они выключены.

Вот мой код:

override fun onStart() {
    super.onStart()
    requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), PERMISSION_REQUEST_CODE)
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == PERMISSION_REQUEST_CODE && permissions.contains(Manifest.permission.ACCESS_FINE_LOCATION)) {
        if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
            if (!BluetoothAdapter.getDefaultAdapter().isEnabled) {
                startActivityForResult(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), ENABLE_BLT_REQUEST_CODE)
            } else {
                viewModel.discoverBLTDevices()
            }
        } else {
            showToast("Location permission needed to scan for devices.")
        }
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == ENABLE_BLT_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            viewModel.discoverBLTDevices()
        } else if (resultCode == Activity.RESULT_CANCELED) {
            finish()
        }
    }
}

1 Ответ

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

Первый раз, когда вы запрашиваете разрешение, если пользователю отказано, во второй раз вы должны показать настраиваемое диалоговое окно (или что-то еще), чтобы сообщить пользователю, что он / она должен разрешить разрешение местоположения из настройки, а также перейти к настройкам.

Пример:

private fun requestLocationPermissions() {
    // shouldShowRequestPermissionRationale method checks permission is not granted. 
    // So Requesting permission

    if (!shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION) 
|| !shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION)) {
    requestPermission(PERM_ID, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
  } else {
     showPermissionRequiredDialog()
  }
}


fun showPermissionRequiredDialog() {
    val alertDialog = MaterialAlertDialogBuilder(context, R.style.DarkDialogTheme)
        alertDialog.setTitle("title")
        alertDialog.setMessage("your message to user")
        alertDialog.setPositiveButton(R.string.label_ok, DialogInterface.OnClickListener { dialog, which ->
            val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID))
            context.startActivity(intent)
        })
        alertDialog.show()

    }
}

Также посмотрите это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...