Отправить сенсорное событие, используя 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
Другие вопросы по тегам