Я пишу приложение, в котором его единственная функция - приемник Bluetooth Low Energy. Приложение бесполезно, если пользователь не разрешает BLE. Когда приложение запускается в первый раз, я хочу, чтобы оно запрашивало у пользователя разрешение на размещение (так как Android требует его для BLE). Я открываю диалог разрешений, но остальная часть приложения продолжается, пока пользователь читает диалог, запускает BLEScanner и все такое. Я хочу, чтобы приложение сделало паузу, пока пользователь читает диалог и решает, что делать. Вот мои настройки:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE);
}
//More UI preparation stuff
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE: {
if (permissions[0].equals(Manifest.permission.ACCESS_COARSE_LOCATION)) {
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
PermissionDialog newDialog = new PermissionDialog();
newDialog.show(getSupportFragmentManager(), "Request Location Permission");
}
}
}
}
Где "PermissionDialog" - это другой класс, который использует DialogFragment, чтобы объяснить, почему приложению требуется разрешение, а затем закрывает / перезапускает приложение. В этом случае остальная часть приложения продолжает работу, пытаясь выполнить Bluetooth, пока пользователь все еще читает диалоговое окно с разрешениями, которое появилось! Наивно, я думал, что мог бы использовать синхронизирующую блокировку, чтобы сделать это, как показано ниже, но в этом случае обратный вызов никогда не вызывается:
private final Object initLock = new Object();
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE);
}
Log.i("Lock", "At the lock!");
try {
synchronized (initLock) {
initLock.wait();
}
}
catch (InterruptedException e) {
//TODO find out what to do here
}
Log.i("Lock", "Past the lock!");
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE: {
if (permissions[0].equals(Manifest.permission.ACCESS_COARSE_LOCATION)) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
synchronized (initLock){
initLock.notify();
}
}
else{
PermissionDialog newDialog = new PermissionDialog();
newDialog.show(getSupportFragmentManager(), "Request Location Permission");
}
}
}
}
}
Как правильно это сделать? У меня есть несколько идей, но все они раздуваются. Нужно ли создавать другой класс, который наследует AppCompatActivity для выполнения разрешений, и я вызываю его как поток? Но тогда как мне узнать, куда пойдет обратный вызов onRequestPermissionResult? Я в растерянности.