Подтвердить что ты не робот

Оверлей экрана обнаружены блоки Android-разрешения

Я заметил странную проблему с моим Android-приложением на моем новом телефоне. Всплывающие всплывающие окна SDK 23, такие как внешнее хранилище, блокируются приложением ниже. Первоначально я думал, что это связано с моим телефоном, но, похоже, это не влияет на мои другие установленные приложения.

Возможно, эта проблема связана с установкой отладочной версии или что-то не так с моей обработкой прав? Я думал, что это может быть связано с одной из рекламных платформ, которые я использую, но я попытался отключить их, и он все еще показывался

введите описание изображения здесь

Я вставил функцию сохранения изображений, которая сгенерирует этот запрос разрешения ниже. Я использую Dexter, чтобы сэкономить на написании целой группы ужасных шаблонов

public static void saveToExternalStorageIfAllowed(final Context context, final Bitmap bitmapImage, final String title) {
    final Tracker t = ((LoLHistory) context.getApplicationContext()).getTracker(LoLHistory.TrackerName.APP_TRACKER);

    // saving to publicly visible/accessible folder. Requires write permission
    int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        // do not have permissions to write, request
        t.send(new HitBuilders.EventBuilder()
                .setCategory("FILE")
                .setAction("PermissionMissing")
                .setLabel("WRITE_EXTERNAL")
                .build());
        Dexter.checkPermission(new PermissionListener() {
            @Override
            public void onPermissionGranted(PermissionGrantedResponse response) {
                t.send(new HitBuilders.EventBuilder()
                        .setCategory("FILE")
                        .setAction("PermissionGranted")
                        .setLabel("WRITE_EXTERNAL")
                        .build());

                saveToExternalStorage(context, bitmapImage, title);
            }

            @Override
            public void onPermissionDenied(PermissionDeniedResponse response) {
                t.send(new HitBuilders.EventBuilder()
                        .setCategory("FILE")
                        .setAction("PermissionDenied")
                        .setLabel("WRITE_EXTERNAL")
                        .build());
            }

            @Override
            public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {/* ... */}
        }, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    } else {
        saveToExternalStorage(context, bitmapImage, title);
    }
}

private static void saveToExternalStorage(Context context, Bitmap bitmapImage, String title) {
    Tracker t = ((LoLHistory) context.getApplicationContext()).getTracker(LoLHistory.TrackerName.APP_TRACKER);

    // create image folder if does not exist
    File imagesFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), context.getString(R.string.app_name));
    if (!imagesFolder.mkdirs() && !imagesFolder.isDirectory()) {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // failed to create and is not a directory. Something went wrong...
            t.send(new HitBuilders.EventBuilder()
                    .setCategory("FILE")
                    .setAction("CreateDirFailed")
                    .setLabel(imagesFolder.getPath())
                    .build());
        } else {
            t.send(new HitBuilders.EventBuilder()
                    .setCategory("FILE")
                    .setAction("CreateDirFailedMediaNotMounted")
                    .setLabel(imagesFolder.getPath())
                    .build());
        }
    }

    // delete image if already exists so FOS can create a new one
    File image = new File(imagesFolder, title + ".jpg");
    if (image.exists()) {
        // image already exists, deleting to start from clean state
        if (!image.delete()) {
            // failed to delete
            t.send(new HitBuilders.EventBuilder()
                    .setCategory("FILE")
                    .setAction("DeleteFailed")
                    .setLabel(image.getPath())
                    .build());
        }
    }

    // compress bitmap and write to file stream. FOS creates file if does not exist
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(image);
        bitmapImage.compress(Bitmap.CompressFormat.JPEG, 50, out);
        out.flush();
    } catch (Exception e) {
        e.printStackTrace();
        t.send(new HitBuilders.ExceptionBuilder()
                .setDescription(e.getLocalizedMessage())
                .setFatal(true)
                .build());
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            t.send(new HitBuilders.ExceptionBuilder()
                    .setDescription(e.getLocalizedMessage())
                    .setFatal(true)
                    .build());
        }
    }

    // get Uri from saved image
    Uri uriSavedImage = Uri.fromFile(image);

    // media scan the new file so it shows up in the gallery
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(uriSavedImage);
    context.sendBroadcast(mediaScanIntent);
}

ОБНОВЛЕНИЕ. Поскольку многие люди упоминают об этом, как было сказано ранее, эта проблема связана не с тем, что установлено приложение наложения. В меню "Рисование над другими приложениями" у меня есть следующие приложения: Google Play Музыка, Службы Google Play, Фотографии, TalkBack, Twitch, Twitter. Все они установлены на No.

Кроме того, я тестировал другие приложения, такие как Google Hangouts и Twitter, которые также имеют действия, требующие опасных разрешений, и я могу предоставить эти разрешения без этой проблемы.


Решение: Я отметил R. Загорский отвечает как решение, так как включает в себя множество общих случаев. Для меня это был Toast, который нарушал мой поток разрешений. Это всплывающее окно потратило так много времени, отправив меня на совершенно неправильный путь...

Это Toast, который я видел в течение первых нескольких секунд после появления всплывающего окна разрешения:

введите описание изображения здесь

4b9b3361

Ответ 1

Это всплывающее окно вызвано объявлением манифеста manifest.PERMISSION.SYSTEM_ALERT_WINDOW. Это 3 категории разрешений, о которых разработчик должен знать.:

  • Нормальное разрешение - ничего не делать с ними, просто объявить в манифесте
  • Уязвимые разрешения - объявить в манифесте и запросить разрешение в первый раз. Их можно изменить с помощью системных настроек.
  • Над опасными разрешениями: SYSTEM_ALERT_WINDOW и WRITE_SETTINGS относятся к этой категории. Они должны быть предоставлены, но не отображаются в системных настройках. Чтобы запросить его, вы не используете стандартный способ (int checkSelfPermission (String permission)), но вы должны соответствующим образом проверить Settings.canDrawOverlays() или Settings.System.canWrite()

Если у вас нет разрешения SYSTEM_ALERT_WINDOW:

  • проверьте, есть ли при видимости Toast при взаимодействии с всплывающим окном разрешений.. Хотя всплывающее окно Overlay Detected не упоминает об этом, Toast также учитывается как оверлей
  • проверить, требуется ли какая-либо из ваших зависимостей.

Если вы не уверены, используете ли вы это разрешение, есть несколько тестовых примеров, которые вы можете сделать:

  • Запросите это разрешение самостоятельно:

    public class MainActivity extends AppCompatActivity {
    
        public final static int REQUEST_CODE = 10101;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            if (checkDrawOverlayPermission()) {
                startService(new Intent(this, PowerButtonService.class));
            }
        }
    
        public boolean checkDrawOverlayPermission() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                return true;
            }
            if (!Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, REQUEST_CODE);
                return false;
            } else {
                return true;
            }
        }
    
        @Override
        @TargetApi(Build.VERSION_CODES.M)
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == REQUEST_CODE) {
                if (Settings.canDrawOverlays(this)) {
                    startService(new Intent(this, PowerButtonService.class));
                }
            }
        }
    }
    
  • Убедитесь, что this или это не ваше дело

  • Ознакомьтесь с этим сообщением, чтобы знать, что при установке приложения через Play Store это разрешение автоматически предоставляется (я не проверял, поэтому не могу подтвердить )

Модель разрешения может быть понята, иногда требуется больше копания.

Ответ 2

Это не проблема, у вас просто установлено приложение с надписью, наиболее распространенными являются

  • Facebook Messenger
  • Whatsapp с включенным всплывающим окном
  • Главы чатов Seebye
  • Viber
  • Любое приложение, отображающее меню или что-то на экране, является надстройкой.

просто закройте его, затем попробуйте.

Ответ 3

Это всплывающее окно стало проблемой при включении диспетчера разрешений в Android Marshmallow. Если на вашем телефоне есть какие-либо приложения, у которых есть разрешение на наложение на экран, существует ряд настроек разрешений, включая доступ к файлам, которые вы не можете изменить, не отключая сначала разрешения наложения на экране. Для меня, мое текстовое приложение и приложение facebook messenger являются виновниками. Каждый раз, когда я хочу предоставить любому другому приложению требуемые разрешения, я должен щелкнуть опцию "Открыть настройки" в этом всплывающем окне и отменить доступ к экрану для двух вышеупомянутых приложений, а затем снова открыть приложение, чтобы снова запросить разрешение. Затем мне нужно снова включить разрешения наложения, если я хочу, чтобы мои сообщения всплывали или мои чаты. Это очень раздражает. Я думаю, что ваше приложение в порядке, управление правами на андроид - всего лишь путаный беспорядок.

Ответ 4

При обнаружении наложения экрана система не позволит вам продолжать предоставлять разрешения для приложений. Потому что наложение экрана может получить вход пользователя. Поэтому перед предоставлением разрешений для ваших приложений вам необходимо отключить все "наложения экрана". Это не проблема вашего приложения. Все приложения, имеющие целевой SDK 23, получают эту проблему.

Ответ 5

Обычно это вызвано использованием плавающего приложения.

Для пользователей телефонов Android Android Samsung:

Open the Settings
Then Applications > Application manager
Press on More > Apps that can appear on top

Если вы найдете приложение с пузырьком, на экране появится экран. Если приложение настраивает яркость ваших телефонов, отключите опцию наложения экрана в этих приложениях. Дело в том, что вам нужно выяснить, что такое преступное приложение, и отключить наложение экрана.

Источник: Исправлена ​​ошибка наложения экрана на Android

Ответ 6

В основном функция наложения экрана используется почти всеми приложениями, но дело в том, что последние термины и условия пользователей андроидного зефира не позволяют предоставлять разрешения на грант без отключения экрана всех приложений в текущей ситуации (в то время как разрешения на предоставление прав пользователям)...

Отключение экрана наложения всех приложений не решит проблему, на самом деле вам нужно также отключить наложение экрана скрытых системных приложений...

Решение прост и просто, просто нужно перейти на вариант Показывать системные приложения, применяя решение...

Источник: Обнаружено наложение экрана - как решить эту проблему на любом устройстве Android

Ответ 7

Я выбрал googled для стольких решений, но ничего не получилось. Затем я попытался со всеми параметрами в настройках:)

Наконец, я могу дать вам определенный способ отключить оверлей -

Выберите "Настройка" > "Приложение" > "Приложение по умолчанию" > "Помощь устройства" > "Включить чтение текста на экране"