Android开发-通过ADB+Socket实现USB数据传输


上一篇文章写到了如何连接ADB,接下来要做的就是如何利用Socket通信。


现在我们用java代码来实现连接。

需要在项目中导入ddmlib.jar。位于SDK中..\sdk\tools\lib\ddmlib.jar


ADB连接代码如下:

public static int PC_LOCAL_PORT = 22222;
public static int PHONE_PORT = 22222;
private static ADB mADB;
private static IDevice[] mDevices;
private static IDevice mDevice;
    public static void main(String[] args) {
        mADB = new ADB();
        mADB.initialize();
        mDevices = mADB.getDevices();
        mDevice = mDevices[0];//取第一个连接的设备
        try {
            mDevice.createForward(PC_LOCAL_PORT, PHONE_PORT);//映射端口
        } catch (TimeoutException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (AdbCommandRejectedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        initializeConnection();//socket数据传输

    }
public class ADB {
    private AndroidDebugBridge mAndroidDebugBridge;

    public boolean initialize() {
        boolean success = true;

        String adbLocation = System
                .getProperty("com.android.screenshot.bindir");

        if (success) {
            if ((adbLocation != null) && (adbLocation.length() != 0)) {
                adbLocation += File.separator + "adb";
            } else {
                adbLocation = "adb";
            }
            AndroidDebugBridge.init(false);
            mAndroidDebugBridge = AndroidDebugBridge.createBridge(adbLocation,
                    true);
            if (mAndroidDebugBridge == null) {
                success = false;
            }
        }

        if (success) {
            int count = 0;
            while (mAndroidDebugBridge.hasInitialDeviceList() == false) {
                try {
                    Thread.sleep(100);
                    count++;
                } catch (InterruptedException e) {
                }
                if (count > 100) {
                    success = false;
                    break;
                }
            }
        }

        if (!success) {
            terminate();
        }

        return success;
    }

    public void terminate() {
        AndroidDebugBridge.terminate();
    }

    public IDevice[] getDevices() {
        IDevice[] devices = null;
        if (mAndroidDebugBridge != null) {
            devices = mAndroidDebugBridge.getDevices();
        }
        return devices;
    }
}

连接上之后,直接利用socket进行数据传输。

Client:

static Socket socket;

    public static void initializeConnection() {
        // Create socket connection
        try {
            socket = new Socket("localhost", PC_LOCAL_PORT);
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("llaalal".getBytes());
            outputStream.close();
            socket.close();
        } catch (UnknownHostException e) {
            System.err.println("Socket connection problem (Unknown host)"
                    + e.getStackTrace());
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("Could not initialize I/O on socket");
            e.printStackTrace();
        }
    }

Server:

public static final String TAG = "server";
public static int PHONE_PORT = 22222;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.mContext = this;
        this.textView = (TextView) this.findViewById(R.id.textView1);
        try {
            server = new ServerSocket(PHONE_PORT);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        new RepackTestTask().execute();

    }
     private class RepackTestTask extends AsyncTask<Object, Object, Object> {  
            @Override  
            protected Object doInBackground(Object... params) {  
                Socket client = null;  
                // initialize server socket  
                while (true) {  
                    try {  
                        // attempt to accept a connection  
                        client = server.accept();  
                        Log.e(TAG, "Get a connection from "  
                                + client.getRemoteSocketAddress().toString());  
                        InputStream inputStream = client.getInputStream();
                        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                        String cache= "";
                        String somewords ="";  
                        while((cache = br.readLine())!=null){
                            somewords +=cache;
                        }
                        Log.e(TAG, "Get some words" + somewords);  
                        this.publishProgress(somewords);  
                        client.close();  
                    } catch (IOException e) {  
                        Log.e(TAG, "" + e);  
                    } 
                }  
            }  
            @Override  
            protected void onProgressUpdate(Object... values) {  
                super.onProgressUpdate(values);  
                Toast.makeText(mContext, values[0].toString(), Toast.LENGTH_LONG)  
                        .show();  
            }  
        }  

运行结果:
无描述


如果不成功,需要确认:

1、有没有导入ddmlib.jar。(位于SDK中..\sdk\tools\lib\ddmlib.jar)
2、adb是否连上。(参考Android开发-通过USB实现ADB控制

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值