2013-01-23 111 views
1

我正在部署一個使用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; 
} 

謝謝

+0

喜能否請您發佈更多的code..I'm試圖做同樣的事情 – Abhi

+0

喜。這是我爲你的問題所做的。我通過改變服務中的座標並將其座標發送到一個方法來移動鼠標指針疊加層,該方法檢查佈局中的任何「視圖」座標是否與疊加層座標匹配,並使用button.performClick() '。這就是我所做的......你可以告訴我你是怎麼做到的 – Abhi

+0

嗨,這是3年前,是我工作的公司,所以不幸我不記得我做了什麼,也沒有我的代碼。 我只記得我原生的,我修改了直接寫入內核的本地代碼的行爲。但那是因爲它是我們自己的設備。 – Marcel

回答

1

正常的方式做到這一點是使用Instrumentation.sendPointerSync(motionEvent);其使用權限:

<uses-permission android:name="android.permission.INJECT_EVENTS"> 
</uses-permission> 

不過。 .. 要接收INJECT_EVENTS權限,您的應用程序必須使用與系統簽名相同的簽名進行簽名。 (運行應用程序的設備的平臺密鑰...) 例如:如果您想在三星設備上運行您的應用程序,您必須使用三星密鑰簽名您的應用程序......只有構造函數可以執行那......(sry)

總之,你的應用程序只能在自己內部注入事件。 (否則這將是一個安全噩夢,想象一個apk讓用戶控制你的手機...)

編輯:如果你有鑰匙(例如,如果你建立自己的設備,自己的ROM)應當與signapk.jar的APK(包含在Android平臺的源代碼包的工具):

java -jar signapk.jar certificate.pem key.pk8 your-app.apk your-signed-app.apk 
+0

mmmh ...好的,謝謝!也許我有我正在使用的設備的標誌。如果沒有,我會嘗試創建一個驅動程序並製作自己的鼠標指針。任何想法在哪裏可以找到的信息? – Marcel

+0

我不知道你的設備targer,但是如果你製作驅動程序,我認爲安全原則應該是相同的,如果你想將它安裝在一個經典的設備上(即非根設備),你的代碼必須呈現「鑑定」(即正在簽署)。所以我認爲你必須爲固定電話工作,或者爲你自己控制安全性的設備/ ROM工作。 – Goo

+0

你可以在這裏找到一種在植根設備上使用注入事件的方法:http://stackoverflow.com/a/7328055/1720391 – Goo