Отправить сенсорное событие, используя OverlayView
Я развертываю приложение, которое создает курсор, используя OverlayView. Я могу перемещать его по экрану и вне приложения (службы).
Но сейчас я хочу реализовать сенсорное событие. Я запускаю курсор в службе, так что я все еще могу переместить его в меню или в любом месте. Но я не знаю, как сделать клик.
Поэтому, когда я нахожусь за пределами своего приложения, если эта служба получает событие нажатия (программно или удаленно), я хочу создать сенсорное событие в представлении под моим курсором.
Любая идея, как получить представление под ним или как отправить событие касания системы?
Вот как я управляю и рисую курсор:
class OverlayView extends ViewGroup {
private Paint mLoadPaint;
boolean mShowCursor;
Bitmap cursor;
public int x = 0,y = 0;
public void Update(int nx, int ny) {
x = nx; y = ny;
}
public void ShowCursor(boolean status) {
mShowCursor = status;
}
public boolean isCursorShown() {
return mShowCursor;
}
public OverlayView(Context context) {
super(context);
cursor = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
mLoadPaint = new Paint();
mLoadPaint.setAntiAlias(true);
mLoadPaint.setTextSize(10);
mLoadPaint.setARGB(255, 255, 0, 0);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//canvas.drawText("Hello World", 0, 0, mLoadPaint);
if (mShowCursor) canvas.drawBitmap(cursor,x,y,null);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}
Спасибо
1 ответ
Нормальный способ сделать это с помощью Instrumentation.sendPointerSync(motionEvent);
которые используют разрешение:
<uses-permission android:name="android.permission.INJECT_EVENTS">
</uses-permission>
Но... чтобы получить разрешение INJECT_EVENTS, ваше приложение должно быть подписано той же подписью, что и система. (Ключ платформы устройства, на котором запущено приложение...) Пример: если вы хотите запустить свое приложение на устройстве Samsung, вы должны подписать свое приложение секретным ключом Samsung... Это может сделать только конструктор... (извините)
В заключение, ваше приложение может вводить события только внутри себя. (иначе это будет кошмар безопасности, представьте себе apk, который позволяет пользователю управлять вашим телефоном...)
Изменить: Если у вас есть ключ (например, если вы создаете свое собственное устройство, собственное ПЗУ), вы должны подписать apk с помощью signapk.jar (инструмент, включенный в исходный пакет платформы Android):
java -jar signapk.jar certificate.pem key.pk8 your-app.apk your-signed-app.apk