簡體   English   中英

ADB和Android App通訊模式

[英]ADB and Android App communication mode

我正在使用從adb控制台定時控制的應用程序。 “ adb shell sendevent”命令控制應用的觸摸事件。 但是這個觸摸事件是定時的,值得推薦

import os


apkLocation = "/Users/siddharthan64/Desktop/adt/sdk/platform-tools/"
os.chdir(apkLocation)

cmdList = ['./adb shell sendevent /dev/input/event2: 3 53 251','./adb shell sendevent /       dev/input/event2: 3 54 399','./adb shell sendevent /dev/input/event2: 3 48 10','./adb shell  sendevent /dev/input/event2: 3 50 7','./adb shell sendevent /dev/input/event2: 0 2 0']
cmdList.append['./adb shell sendevent /dev/input/event2: 3 50 7']
cmdList.append[,'./adb shell sendevent /dev/input/event2: 0 2 0']
cmdList.append['./adb shell sendevent /dev/input/event2: 0 0 0']
cmdList.append['./adb shell sendevent /dev/input/event2: 3 57 0']
cmdList.append['./adb shell sendevent /dev/input/event2: 3 53 251']
cmdList.append['./adb shell sendevent /dev/input/event2: 3 54 399']
cmdList.append['./adb shell sendevent /dev/input/event2: 3 48 0']
cmdList.append['./adb shell sendevent /dev/input/event2: 3 50 0']
cmdList.append['./adb shell sendevent /dev/input/event2: 0 2 0']
cmdList.append['./adb shell sendevent /dev/input/event2: 0 0 0']
for tcmd in cmdList:
p = os.popen(tcmd,"r")

在應用上發生特定事件時發送。

實際上, sendevent因設備而sendevent 這是根據我的個人經驗。 如果您嘗試模擬觸摸事件,則可以使用Android中的Instrumentation概念。

因此,您需要有一個BroadcastReceiver ,它可以從adb shell接收輸入的觸摸坐標。

以下是具有檢測代碼的BroadcastReceiver的代碼:

public void onReceive(Context arg0, Intent i) {
        // TODO Auto-generated method stub
        //Toast.makeText(arg0, "Broadcast intent received...", Toast.LENGTH_SHORT).show();

        String args=i.getStringExtra("vals");
        String[] arr=args.split(" ");
        final int myVal1=Integer.parseInt(arr[0]);
        final int myVal2=Integer.parseInt(arr[1]);
        //Toast.makeText(arg0, "vals:"+args, Toast.LENGTH_SHORT).show();
        //Toast.makeText(arg0, "myVal1="+myVal1+"\nmyVal2="+myVal2, Toast.LENGTH_SHORT).show();

        Thread myThread=new Thread()
        {
            public void run() {
                Instrumentation myInst = new Instrumentation();
                myInst.sendKeyDownUpSync( KeyEvent.KEYCODE_B );

                myInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
                        SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,myVal1, myVal2, 0));

                myInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
                        SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,myVal1, myVal2, 0));
            };
        };
        myThread.start();
    }

您需要在manifest注冊BroadcastReceiver ,如下所示:

<receiver android:name="MyReceiver" android:exported="true">
    <intent-filter>
      <action android:name="android.intent.action.VIEW" /> 
    </intent-filter>
</receiver>

應用啟動后,以調試模式連接設備,在命令提示符下,輸入以下命令:

adb shell am broadcast --es vals "10 20" -n com.pkgName.appName/com.pkgName.appName.MyReceiver

上面的命令將觸發您的應用程序的BroadcstReceiver ,並且將在坐標(10,20)處模擬觸摸。 您可以將其替換為所需的值。

注意:如果將應用程序最小化,並且您正在嘗試模擬觸摸事件,則該應用程序將被強制關閉,因為android開發人員限制了這種未來,因為它很容易被黑客濫用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM