Проблема возникает из-за того, что метод `requestPermissions()` вызывается каждый раз при создании активности (`onCreate`), что приводит к постоянному перезапуску экрана. Чтобы избежать этого, необходимо сначала проверить, есть ли уже необходимые разрешения, и только в случае их отсутствия запрашивать их у пользователя.
Вот как можно это реализовать:
1. **Добавьте проверку разрешений перед вызовом `requestPermissions()`.**
2. **Используйте `ContextCompat.checkSelfPermission` для проверки состояния разрешений.**
Вот пример кода, который демонстрирует, как это сделать:
import android.Manifest;
import android.content.pm.PackageManager;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSIONS_REQUEST_CODE = 1000;
private String[] appPermissions = {
Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_SMS
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!hasPermissions()) {
requestPermissions(appPermissions, PERMISSIONS_REQUEST_CODE);
} else {
// Разрешения уже есть, можно продолжать работу
proceedAfterPermission();
}
}
private boolean hasPermissions() {
for (String permission : appPermissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
private void proceedAfterPermission() {
// Логика после получения необходимых разрешений
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_REQUEST_CODE) {
boolean allGranted = true;
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
allGranted = false;
break;
}
}
if (allGranted) {
// Все разрешения предоставлены
proceedAfterPermission();
} else {
// Разрешения не предоставлены, можно показать сообщение пользователю
// или закрыть приложение
}
}
}
}
**Пояснения к коду:**
1. **Метод `hasPermissions()`:** Проверяет, все ли необходимые разрешения уже предоставлены. Возвращает `true`, если все разрешения есть, и `false` в противном случае.
2. **Вызов `requestPermissions()`:** Этот метод вызывается только если `hasPermissions()` вернул `false`, то есть если хотя бы одно из разрешений отсутствует.
3. **Метод `onRequestPermissionsResult()`:** Обрабатывает результат запроса разрешений. Если все разрешения предоставлены, можно продолжить работу приложения. В противном случае можно уведомить пользователя о необходимости предоставления разрешений или ограничить функционал приложения.
Chromatic ScaleПросветленный (28023)
3 недели назад
**Дополнительные советы:**
- **Пользовательский опыт:** Рекомендуется объяснить пользователю, зачем вашему приложению нужны те или иные разрешения, прежде чем запрашивать их. Это можно сделать с помощью диалогового окна с пояснением.
- **Обработка отказа:** Подумайте о том, как ваше приложение будет вести себя, если пользователь откажет в предоставлении разрешений. Возможно, некоторые функции будут недоступны, и это стоит учесть в логике приложения.
- **Минимизация количества проверок:** Хотя кажется, что добавление проверок увеличивает количество кода, это стандартная практика в Android-разработке и обеспечивает стабильную работу приложения.
Следуя этому подходу, вы избежите повторных вызовов `requestPermissions()`, что предотвратит перезапуск экрана и зависание приложения.
С ней каждую секунду вызывается oncreate и пересоздаётся экран, всё виснет
Без неё всё ок, но надо же разрешение запросить
Про то, что можно сначала проверить, есть ли разрешение, и только в случае, если его нет, спрашивать у пользователя, я в курсе, но не хотелось бы городить много проверок, плюс в java я недавно (так-то я по веб-языкам) и не знаю, как получить true/false по поводу определённого разрешения. Может, кто подскажет функцию? Ну или костыль какой на крайний. Хотя лучше функцию