Intereting Posts
Как применить прозрачность (фокус?) ON нажатие любого пункта (как это делает Google)? Предварительный макет с тегом корня слияния в Intellij IDEA / Android Studio Как найти самые близкие места на основе текущего lat и long с использованием Parse API (parse.com) в android Как я могу ссылаться на класс drawable в Android XML Получение NoSuchMethodError с помощью методов TextView Как обращаться с кнопкой «назад», когда активен startActivityForResult? Как сделать расширенный пользовательский интерфейс в Android? Android Google Directions Service можно использовать изначально? С оболочкой? Доступны общественные транспортные / велосипедные маршруты? Экран всплывающего окна приложения Worklight на Android Использование атрибута onClick в макете xml вызывает NoSuchMethodException в диалоговом окне Android Android Animate Rotate Мягкая клавиатура Samsung теряет нажатие клавиш после изменения фокуса Сохранить собственное состояние экземпляра ListView? Как отключить аппаратное ускорение в SurfaceView? Как избежать нескольких экземпляров одной и той же Деятельности?

Emulate Back Button с наложением в Android

У меня есть корневое устройство Android и вы хотите заменить программные клавиши собственным наложением. Это работает с приложением «full! Screen», но я хочу сделать это в своем приложении. Я искал и нашел здесь несколько вопросов, но ответов на них не было.

Я понял, как это сделать с оболочкой, но это очень медленно, «полный экран» имеет гораздо лучшую производительность.

Моя служба с командой оболочки выглядит так:

public class MainService extends Service { ButtonView mView; @Override public void onCreate() { super.onCreate(); final Bitmap BckBtn = BitmapFactory.decodeResource(getResources(), R.drawable.back); WindowManager.LayoutParams params = new WindowManager.LayoutParams( BckBtn.getWidth(), BckBtn.getHeight(), WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); params.gravity = Gravity.LEFT | Gravity.BOTTOM; WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); mView = new ButtonView(this,BckBtn); mView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { if(arg1.getX()<BckBtn.getWidth() & arg1.getY()>0) { Process process = null; try { process = Runtime.getRuntime().exec("su"); } catch (IOException e) { e.printStackTrace(); } OutputStream outputStream = process.getOutputStream(); String cmd = "input keyevent 4"; try { outputStream.write((cmd + "\n").getBytes("ASCII")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return false; } }); wm.addView(mView, params); } @Override public IBinder onBind(Intent arg0) { return null; } } @SuppressLint("DrawAllocation") class ButtonView extends ViewGroup { Bitmap BckBtn; public ButtonView(Context context,Bitmap BckBtn) { super(context); this.BckBtn=BckBtn; } protected void onDraw(Canvas canvas) { canvas.drawBitmap(BckBtn,0 , 0, null); } protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { } public boolean onTouchEvent(MotionEvent event) { return true; } }