Как можно определить жесты экрана вне собственного приложения?
Я знаю, что ТАК сильно хмурится на вопросы "как мне это сделать", но на этот раз я не вижу способа обойти это.
Я опытный и опытный разработчик Android, поэтому я чувствую себя очень глупо, задавая этот вопрос, но я только что установил это приложение, и оно делает то, что я считал невозможным.
А именно, он слушает жесты экрана (в данном случае смахивает с краев экрана внутрь) независимо от того, где вы находитесь на своем устройстве... то есть он слушает, когда вы находитесь на домашних экранах Launcher и когда вы находитесь в ДРУГИЕ приложения... независимо от того, что вы делаете, он слушает, и когда он обнаруживает пролистывание от края экрана, он позволяет вам вывести скрытый ящик настроек, который затем становится прозрачным (фрагмент? Диалог?) View
в дополнение к любому другому приложению, в котором вы находитесь, и когда оно закрыто (нажатием НАЗАД), вы останетесь там, где вы были в предыдущем опыте.
Я, честно говоря, понятия не имею, как это возможно, и очень хотел бы подтолкнуть в правильном направлении. [РЕДАКТИРОВАТЬ]
2 ответа
Есть две вещи, с которыми вы должны справиться:
показывая вид сверху. для этого вам нужно использовать специальное разрешение TYPE_SYSTEM_ALERT. Вот код для отображения вида сверху:
final WindowManager.LayoutParams param=new WindowManager.LayoutParams(); param.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; final View view=findViewById(R.id.view1); final ViewGroup parent=(ViewGroup)view.getParent(); if(parent!=null) parent.removeView(view); param.format=PixelFormat.RGBA_8888; param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; param.gravity=Gravity.TOP|Gravity.LEFT; param.width=view.getLayoutParams().width; param.height=view.getLayoutParams().height; final WindowManager wmgr=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); wmgr.addView(view,param); // TODO handle overlapping title bar and/or action bar // TODO you must add logic to remove the view // TODO you must use a special permission to use this method :android.permission.SYSTEM_ALERT_WINDOW
поддерживая приложение в живых. для этого вам нужно создать сервис, который работает на переднем плане, а это значит, что он использует уведомление. вот ссылка.
Есть много приложений, которые имеют эту возможность. первым, кого я видел, был AirCalc.
Теперь это считается уязвимостью безопасности, которая была подключена к Android 4.0.3+: Вопрос: TYPE_SYSTEM_OVERLAY в ICS Это / было названо кражей. ИМХО, теперь следует избегать создания чего-то, что зависит от этой функциональности, поскольку теперь это то, что официально будет исправлено, если в будущих версиях будут найдены другие методы. Однако на этот вопрос есть ответ, который показывает вам, как это сделать в 4.0.3+. Если вы решите пойти по этому пути, знайте, что ваша способность сделать это может исчезнуть с более новыми версиями Android.