Я пишу приложение, которое подключается к устройству bluetooth, поэтому, очевидно, одно из первых действий, которое нужно сделать, - это проверить, есть ли у меня необходимые разрешения при запуске, когда приложение пытается подключиться.
Мое намерение было чтобы предоставить предупреждение, объясняющее, почему необходимы разрешения, с помощью AlertDialog
, прежде чем предлагать пользователю их предоставить. Однако пользовательский интерфейс не отображается, если я не сделаю это в другом потоке, и даже тогда я не вижу AlertDialog
. Ниже показано, как я все это делаю (с одним разрешением для краткость). Почему у меня не отображается предупреждение и почему он не позволяет отображать пользовательский интерфейс при вызове после setContentView()
? Я получаю все отзывы Log.i()
, и они повторяются каждые 2 секунды без предупреждения. Что мне делать в этом случае?
class ConnectDeviceActivity : AppCompatActivity() {
private lateinit var binding: ActivityConnectDeviceBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_connect_device)
binding.lifecycleOwner = this
}
override fun onStart() {
super.onStart()
// below line prevents UI rendering unless called in new thread eg Thread(Runnable {})
while( !checkPermissions()) {sleep(2000L)}
// now we can do other stuff like connect to the device here.
}
private fun checkPermissions(): Boolean {
when {
!(PermissionChecker.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) == PermissionChecker.PERMISSION_GRANTED) -> {
Log.i(TAG, "permission ACCESS_COARSE_LOCATION")
displayRationale(getString(R.string.permission_access_coarse_location))
return false
}
// other permissions omitted for brevity
}
return true
}
private fun displayRationale(permissionString: String) {
Log.i(TAG, "Displaying permission rationale...")
var alertBuilder = AlertDialog.Builder(this)
.setMessage(permissionString)
.setNegativeButton("Exit") { _, _ -> moveTaskToBack(true); exitProcess(-1)}
when(permissionString) {
getString(R.string.permission_access_coarse_location) -> {
Log.i(TAG, getString(R.string.permission_access_coarse_location))
alertBuilder.setPositiveButton("Fix issue") { _, _ -> // create onclick function
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
PERMISSION_ACCESS_COARSE_LOCATION)
}
}
}
Log.i(TAG, "Going to show alert")
alertBuilder.create().show()
Log.i(TAG, "Alert has been shown")
}
}