Обнаружение наложения экрана блокирует разрешения Android
Я заметил странную проблему с моим Android-приложением на моем новом телефоне. Всплывающие окна с разрешениями SDK 23, такие как внешнее хранилище, блокируются приложенным ниже предупреждением. Сначала я думал, что это связано с моим телефоном, но, похоже, это не влияет на другие мои установленные приложения.
Возможно, эта проблема связана с установкой отладочной версии, или это что-то не так с моей обработкой разрешений? Я думал, что это может быть как-то связано с одной из рекламных платформ, которые я использую, но я пытался отключить их, и это все еще показывалось
Я вставил функцию сохранения изображения, которая генерирует этот запрос на разрешение ниже. Я использую Декстер, чтобы сэкономить на написании целой кучи отвратительного шаблона
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);
}
ОБНОВЛЕНИЕ: так как многие люди упоминают об этом, как уже говорилось ранее, эта проблема не из-за установки наложенного приложения. В меню Draw поверх других приложений у меня есть следующие приложения: Google Play Music, сервисы Google Play, Photos, TalkBack, Twitch, Twitter. Все они установлены на Нет.
Кроме того, я протестировал другие приложения, такие как Google Hangouts и Twitter, в которых также есть действия, для которых требуются опасные разрешения, и я могу предоставить эти разрешения без этой проблемы.
РЕШЕНИЕ: Я отметил ответ R. Zagórski как решение, так как он включает много общих случаев. Для меня это было на самом деле Toast
это нарушало мой поток разрешений. Это всплывающее окно потратило так много времени, отправив меня на совершенно неверный путь...
Это Toast
Я видел первые несколько секунд после появления всплывающего окна с разрешениями:
9 ответов
Это всплывающее окно вызвано декларацией manifest.PERMISSION.SYSTEM_ALERT_WINDOW, объявленной манифестом. Это 3 категории разрешений, о которых должен знать разработчик:
- Нормальное разрешение - ничего с ними не делать, просто объявить в Манифесте
- Уязвимые разрешения - объявите в манифесте и запросите разрешение в первый раз. Их можно изменить через настройки системы
- Над опасными разрешениями: SYSTEM_ALERT_WINDOW и WRITE_SETTINGS относятся к этой категории. Они должны быть предоставлены, но не отображаются в настройках системы. Для запроса вы не используете стандартный способ (
int checkSelfPermission (String permission)
) но вы должны проверитьSettings.canDrawOverlays()
или жеSettings.System.canWrite()
надлежащим образом
Если у вас нет разрешения SYSTEM_ALERT_WINDOW:
- проверьте, есть ли у вас
Toast
отображается при взаимодействии с всплывающим окном разрешений. Хотя всплывающее окно "Обнаружено наложение" не упоминает об этом,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)); } } } }
Прочтите этот пост, чтобы быть в курсе, что при установке приложения через Play Store это разрешение предоставляется автоматически (я не проверял, поэтому не могу подтвердить)
Модель разрешений можно понять, просто иногда требуется больше копать.
Это не проблема, у вас просто установлено приложение наложения, наиболее распространенными являются
- Facebook Messenger
- WhatsApp с включенным всплывающим окном
- Seebye Чат головы
- Viber
- Любое приложение, которое показывает меню или что-то на экране, является приложением наложения.
просто закрой, потом попробуй.
Это всплывающее окно стало проблемой с включением диспетчера разрешений в Android Marshmallow. Если на вашем телефоне установлены приложения с разрешением наложения на экран, существует ряд настроек разрешений, включая доступ к файлам, которые нельзя изменить, предварительно не отключив эти разрешения наложения на экране. Для меня, мое текстовое приложение и приложение мессенджер Facebook являются виновниками. Каждый раз, когда я хочу дать любому другому приложению запрашиваемые разрешения, я должен щелкнуть опцию "Открыть настройки" в этом всплывающем окне и отозвать доступ к наложению экрана для двух вышеупомянутых приложений, а затем снова открыть соответствующее приложение, чтобы снова получить запрос на разрешение. Затем я должен снова включить разрешения наложения, если мне нужны всплывающие сообщения или заголовки чата. Это действительно раздражает. Я думаю, что с вашим приложением все в порядке, управление разрешениями в Android - просто беспорядок.
При обнаружении наложения экрана система не позволит вам продолжать предоставлять разрешения для приложений. Потому что наложение экрана может получить ввод пользователя. Таким образом, вы должны отключить все элементы "наложения экрана", прежде чем предоставлять разрешения для ваших приложений. Это не проблема вашего приложения. Все приложения, имеющие целевой SDK 23, получают эту проблему.
Обычно это вызвано использованием плавающего приложения.
Для пользователей Samsung Android Phone:
Open the Settings
Then Applications > Application manager
Press on More > Apps that can appear on top
Если вы найдете приложение с пузырьком, отобразите наложение экрана. Если приложение регулирует яркость телефона, отключите параметр наложения экрана в этих приложениях. Дело в том, что вам нужно выяснить причину и отключить наложение экрана.
Источник: исправить обнаруженную ошибку наложения экрана на Android
В основном, функция "Наложение экрана" используется практически во всех приложениях, но дело в том, что последние условия использования зефира Android не могут предоставлять разрешения без отключения наложения экрана всех приложений в текущей ситуации (в то время как пользователь предоставляет разрешения)...
Отключение наложения экрана всех приложений не решит проблему, на самом деле вам нужно отключить наложение экрана скрытых системных приложений...
Решение простое и легкое, вам просто нужно выбрать опцию "Показать системные приложения при применении решения..."
Источник: Обнаружено наложение экрана - Как решить эту проблему на любом устройстве Android
Я нашел много решений, но ничего не помогло. Тогда я попробовал все параметры в настройках:)
Наконец, я могу дать вам определенный способ отключить наложение -
Выберите "Настройки"> "Приложение"> "Приложение по умолчанию"> "Поддержка устройств"> "Поворот текста на экране".
Я исправил эту проблему, установив окно проверки предупреждений: https://play.google.com/store/apps/details?id=jp.sfapps.alertwindowchecker. Он указывает, какие приложения в настоящее время используют функцию наложения экрана.
В моем случае мне пришлось отключить детектор пролистывания в приложении ES FileExplorer, чтобы решить эту проблему.