Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

RequestPermissions() перезапускает экран ежесекундно. Как убрать?

R V Ученик (66), открыт 3 недели назад
Нашёл в процессе отладки. Полный код проблемной строки: requestPermissions(new String[] {android.Manifest.permission.RECEIVE_SMS, android.Manifest.permission.READ _SMS}, 1000);
С ней каждую секунду вызывается oncreate и пересоздаётся экран, всё виснет

Без неё всё ок, но надо же разрешение запросить

Про то, что можно сначала проверить, есть ли разрешение, и только в случае, если его нет, спрашивать у пользователя, я в курсе, но не хотелось бы городить много проверок, плюс в java я недавно (так-то я по веб-языкам) и не знаю, как получить true/false по поводу определённого разрешения. Может, кто подскажет функцию? Ну или костыль какой на крайний. Хотя лучше функцию
1 ответ
Chromatic Scale Просветленный (28023) 3 недели назад
Проблема возникает из-за того, что метод `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()`, что предотвратит перезапуск экрана и зависание приложения.
R VУченик (66) 3 недели назад
Нейросеть отвечала
R VУченик (66) 3 недели назад
Не доверяю нейросетям, они иногда такую фигню пишут
Но попробую, спасиьо
R VУченик (66) 3 недели назад
Но больше так не делайте, очень громоздко
Похожие вопросы