zoukankan      html  css  js  c++  java
  • 利用ddmlib 实现 PC端与android手机端adb forword socket通信(转)

    上篇文章讲了PC与android手机连接的办法 ,通过java调用系统命令执行adb命令操作,实际上是一个比较笨的办法。

    网上查阅资料,发现google 提供了ddmlib库 (adt-bundlesdk ools 目录下), 提供了adb相关操作的所有api。

    文档参考

    http://www.jarvana.com/jarvana/view/com/google/android/tools/ddmlib/r13/ddmlib-r13-javadoc.jar!/index.html

    参考范例如下

    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;


    import com.android.ddmlib.AdbCommandRejectedException;
    import com.android.ddmlib.IDevice;
    import com.android.ddmlib.TimeoutException;




    public class YingyonghuiHubServer {  
        public static final String TAG = "server";  
        public static int PC_LOCAL_PORT = 22222;  
        public static int PHONE_PORT = 22222;  
        public static String ADB_PATH = "adb.exe";  
        
    private static ADB mADB;
    private static IDevice[] mDevices;
    private static IDevice mDevice;


        /** 
         * @param args 
         */  
        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();
        
        }  
        static Socket socket;  
        public static void initializeConnection() {  
            // Create socket connection  
            try {  
                socket = new Socket("localhost", PC_LOCAL_PORT);  
                ObjectOutputStream oos = new ObjectOutputStream(  
                        socket.getOutputStream());  
                oos.writeObject("lalala");  
                oos.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();  
            }  
        }  
    }  

    /*
     * Copyright (C) 2009-2013 adakoda
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */




    import java.io.File;


    import com.android.ddmlib.AndroidDebugBridge;
    import com.android.ddmlib.IDevice;


    public class ADB {
    private AndroidDebugBridge mAndroidDebugBridge;


    public boolean initialize() {
    boolean success = true;


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


    // for debugging (follwing line is a example)
    // adbLocation = "C:\ ... \android-sdk-windows\platform-tools"; // Windows
    // adbLocation = "/ ... /adt-bundle-mac-x86_64/sdk/platform-tools"; // MacOS X

    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;
    }
    }

    手机端代码参考如下

    package com.broadthinking.yingyonghuihubclinet;


    import java.io.IOException;  
    import java.io.ObjectInputStream;  
    import java.net.ServerSocket;  
    import java.net.Socket;  
    import android.app.Activity;  
    import android.content.Context;  
    import android.os.AsyncTask;  
    import android.os.Bundle;  
    import android.util.Log;  
    import android.widget.TextView;  
    import android.widget.Toast;  
    public class MainActivity extends Activity {  
        public static final String TAG = "client";  
        public static int PHONE_PORT = 22222;  
        Context mContext = null;  
        TextView textView = null;  
        ServerSocket server = null;  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);            
            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.d(TAG, "Get a connection from "  
                                + client.getRemoteSocketAddress().toString());  
                        ObjectInputStream ois = new ObjectInputStream(  
                                client.getInputStream());  
                        String somewords = (String) ois.readObject();  
                        Log.d(TAG, "Get some words" + somewords);  
                        this.publishProgress(somewords);  
                        client.close();  
                    } catch (IOException e) {  
                        Log.e(TAG, "" + e);  
                    } catch (ClassNotFoundException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                }  
            }  
            @Override  
            protected void onProgressUpdate(Object... values) {  
                super.onProgressUpdate(values);  
                Toast.makeText(mContext, values[0].toString(), Toast.LENGTH_LONG)  
                        .show();  
            }  
        }  
    }  

    转自:http://blog.csdn.net/wsdx/article/details/9420707

  • 相关阅读:
    MPMoviePlayerController导致statusBar消失,导致内存泄露leak
    OpenRisc-35-基于orpsoc,eCos的sd card controller的测试实验
    编程之美读书笔记---单链表反序---要求只遍历一次
    POJ 3892 RSA Factorization
    hdu1200(来来回回串起来)
    余世维《有效沟通》听课笔记
    Java--Eclipse关联Java源码
    Why Python?
    《超级时间整理术》晨读笔记
    《放弃的艺术》晨读笔记
  • 原文地址:https://www.cnblogs.com/halfmanhuang/p/4294020.html
Copyright © 2011-2022 走看看