В соответствии с файлом манифеста ваш проект настроен так, что MainActivity
является вашей активностью запуска.Это то, где вы начинаете!Но вы также удаляете любой путь назад, вызывая finish()
в двух местах.
Простое решение - просто изменить этот код:
if (checkAndRequestPermissions()){
finish();
return;
}
на эту единственную строку кода:
checkAndRequestPermissions();
А также удалить finish()
в методе onRequestPermissionsResult()
, когда вы переключаетесь на VendorActivity
.Изменение:
Intent i = new Intent(MainActivity.this, VendorActivity.class);
startActivity(i);
finish();
должно быть просто:
Intent i = new Intent(MainActivity.this, VendorActivity.class);
startActivity(i);
Объяснение:
В вашем MainActivity
в onCreate()
метод, который вы проверяете, предоставил ли пользователь разрешение на определение местоположения, используя метод checkAndRequestPermissions()
, если он возвращает true
вы просто выходите из своей программы - гаснет!
if (checkAndRequestPermissions()){ //if this is true .. user has already granted permission then you kill the app! why?
finish();
return;
}
метод checkAndRequestPermissions()
возвращает true
, если пользователь уже предоставил разрешение.
private boolean checkAndRequestPermissions() {
int permissionLocation = ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION);
List<String> listPermissionsNeeded = new ArrayList<>();
if (permissionLocation != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true; //Returns true if permission has already been granted!!
}
Если пользователь не предоставил разрешение, вы запрашиваете его.Таким образом, onRequestPermissionsResult()
запускается с результатами запроса.Если пользователь дает разрешение, вы переходите на VendorActivity
, но в то же время вызываете finish()
, который, проще говоря, удаляет MainActivity
из стека Activity.В этом случае вы показываете VendorActivity
, но при нажатии кнопки «Назад» приложение будет убито, поскольку вы уже удалили MainActivity
из стека.
Если пользователь отказывается дать вам разрешение, вы простоЗять их снова, чтобы дать разрешение, или вы звоните finish()
, чтобы убить приложение