现在的位置: 首页 > 编程技术 > 安卓开发 > 正文

Wifi连接Android真机调试

2015年12月22日 安卓开发 ⁄ 共 3705字 ⁄ 字号 评论 1 条 ⁄ 阅读 199 次

一向使用真机调试,数据线用久了有些接触不良,动作幅度一大,adb就断开链接。再买一根数据线是下下策,干脆买了个360随身Wifi,将手机通过Wifi连上电脑进行调试。没有数据线的牵绊轻松了许多。

电脑与手机用其他方式连在同一个局域网中也可以使用下面的方法。


手动方法

1.在手机上安装终端类App,开启Root权限,打开App,输入以下命令:

su
setprop service.adb.tcp.port 5555
stop adbd
start adbd

其中,su表示获取root权限

2.查看手机的Wifi连接,获取手机IP地址。

3.电脑上打开CMD,输入如下命令:

adb connect 手机IP地址

命令行输入adb devices或者Eclipse的DDMS都可以看到已连接的设备,可以直接进行真机调试


APP

每次连电脑都要在手机上输一大串终端命令实在太繁琐,干脆写了个APP代劳。必须给该APP开启Root权限。连上Wifi后打开APP点击按钮:
Wifi连接Android真机调试

Github:loveNight/AndroidTerminal

Eclipse + ADT插件写的。导入工程后直接用USB调试装到自己手机上使用。

核心代码

手机上运行终端命令的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * CMD 命令行执行工具
 */
public class CmdUtils {
    public static final String COMMAND_SU = "su"; // 表示获取root权限(APP必须已root)
    public static final String COMMAND_LINE_END = "\n";
    public static final String COMMAND_EXIT = "exit\n";

    /**
     * Android手机用Wifi连上电脑ADB调试
     * 须在手机终端输入如下命令
     * 此终端必须已经Root
     */
    public static final String[] wifiConnectToComputer = {
        "setprop service.adb.tcp.port 5555",
        "stop adbd",
        "start adbd"
    };

    public static Result execute(String[] commands) {
        //----------------- 待写:检查此手机是否已经Root-------------

        Runtime runtime = Runtime.getRuntime();

        Process process = null;
        DataOutputStream output = null; // 用于向终端进程输入命令
        BufferedReader successResult = null;
        BufferedReader errorResult = null;
        StringBuilder successMsg = null;
        StringBuilder errorMsg = null;

        try {
            process = runtime.exec(COMMAND_SU);
            output = new DataOutputStream(process.getOutputStream());
            for (String command : commands) {
                if (command == null) {
                    continue;
                }

                output.write(command.getBytes());
                output.writeBytes(COMMAND_LINE_END); // 输完一行命令要按回车
                output.flush();
            }

            output.writeBytes(COMMAND_EXIT);
            output.flush();
            process.waitFor(); // 当前线程等待,直到process线程执行结束

            successMsg = new StringBuilder();
            errorMsg = new StringBuilder();
            successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
            errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));

            String s;
            while ( (s = successResult.readLine()) != null) {
                successMsg.append(s).append("\n");
            }
            while ( (s = errorResult.readLine()) != null) {
                errorMsg.append(s).append("\n");
            }



        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally { // 回收资源
                try {
                    if (output != null) {
                        output.close();
                    }
                    if (successResult != null) {
                        successResult.close();
                    }
                    if (errorResult != null) {
                        errorResult.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if (process != null) {
                    process.destroy();
                }
        }
        return new Result(successMsg == null ? null : successMsg.toString()
                , errorMsg == null ? null : errorMsg.toString());
    }

    public static class Result {
        public String successMsg;
        public String errorMsg;

        public Result(String successMsg, String errorMsg) {
            super();
            this.successMsg = successMsg;
            this.errorMsg = errorMsg;
        }

    }
}

获取手机IP地址需要Wifi权限:

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.net.InetAddress;

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;

public class WifiUtils {

    private static WifiUtils wifiUtils;
    private Context context;

    private WifiUtils(Context context) {
        this.context = context;
    }

    public static WifiUtils getInstance(Context context){
        if (wifiUtils == null) {
            wifiUtils = new WifiUtils(context);
        }
        return wifiUtils;
    }

    /**
     * 获取手机IP地址
     * 必须连上wifi
     */
    public String getIpAddress() {
        int result = 0;
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        result = wifiInfo.getIpAddress();
        return intToIp(result);
    }

    /**
     * 直接获取的IP地址是一个4字节的整数
     * 需要手动处理成常见的192.168.1.155形式
     */
    private String intToIp(int i) {
        return (i & 0xFF ) + "." +
        ((i >> 8 ) & 0xFF) + "." +
        ((i >> 16 ) & 0xFF) + "." +
        ( i >> 24 & 0xFF) ;
    }
}

目前有 1 条留言    访客:1 条, 博主:0 条


  1. 管理员
    admin 2015年12月29日 上午10:06  Δ-9楼

    同喜