Ошибка разрешения все еще отображается, даже если добавлено разрешение в манифесте - PullRequest
0 голосов
/ 22 февраля 2019

Я реализовал AlertDialog в своем классе, который расширяет класс Application, также добавил правильное разрешение в файле манифеста:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

См. Мой код:

private void showAlertDialog(Context context) {
    DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // do some stuff eg: context.onCreate(super)
        }
    };

    AlertDialog.Builder builder = new AlertDialog.Builder(context)
        .setCancelable(false)
        .setMessage("Messag...")
        .setTitle("Title")
        .setPositiveButton("OK", listener);

        Dialog dialog = builder.create();
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        dialog.show();
}

Метод вызова:

showAlertDialog(getApplicationContext());

Я попробовал этот ответ, он работал вчера, сейчас не работает: Как показать диалоговое окно из класса, который расширяет приложение в Android?

Кстати, он работал вчера, я не знаю, почему он не работает сегодня, что мне не хватает?

1 Ответ

0 голосов
/ 22 февраля 2019

Определяли ли вы права доступа во время выполнения, если вы проверяете зефир или устройства уровня API выше?

Проверьте разрешение наложения

public static int OVERLAY_PERMISSION_REQ_CODE = 1234;

public void someMethod() {
if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
}}

В onActivityResult,

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            // SYSTEM_ALERT_WINDOW permission not granted...
        }
    }
}

Наконец ----

Проверьте, имеет ли устройство API 23 +

, если API 23+, затем проверьте, есть ли у пользователя разрешение или нет

если у вас есть разрешение, не ведите его к Settings.ACTION_MANAGE_OVERLAY_PERMISSION, а если еще не разрешили, попросите проверить разрешение во время выполнения

Поставьте ниже строки в вашем onCreate() методе.Поместите это после setContentView()

checkPermission();

Теперь поместите приведенный ниже код в onActivityResult,

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            // You don't have permission
            checkPermission();
        } else {
            // Do as per your logic 
        }
    }
}

Теперь, наконец, код метода checkPermission,

public void checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!Settings.canDrawOverlays(this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
    }
}}

И объявитепеременная как глобальная

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

Happy Coding:)

...