android-代码里使用shell命令(wifi调试)
来源:互联网 发布:日本历史地震数据统计 编辑:程序博客网 时间:2024/05/22 08:24
有时候我们使用某些功能时需要使用到shell命令来启动关闭服务,但是这样效率不高,每次都得自己手动在终端模拟器掉命令,确实麻烦。因此本文以代码实现一键点击发送shell命令来启动wifi调试模式。
先来看看布局把,以一个togglebutton和一个textview为主。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" > <ToggleButton android:id="@+id/wifidebug" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textOff="启动wifi调试" android:textOn="关闭wifi调试" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/notice" /> </LinearLayout> <LinearLayout android:id="@+id/info" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:visibility="gone" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/info" /> <TextView android:id="@+id/ip_info" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/wifi_info" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout></LinearLayout>那么就开始讲解代码了。首先我们根据需求还是得判断网络情况,通过ConnectivityManager的getNetworkInfo方法来取得wifi状态<pre name="code" class="java">ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();if (wifi == State.CONNECTED || wifi == State.CONNECTING) {wifidebug.setEnabled(true);wifi_info.setText("");} else {wifidebug.setEnabled(false);wifi_info.setText("wifi不可用");}
对togglebutton设置点击事件,通过execShell方法来发送命令,这个方法是重点,待会也贴出来
wifidebug.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton arg0, boolean arg1) {// TODO Auto-generated method stubif (arg1) {// true时info.setVisibility(View.VISIBLE);ip_info.setText("请在命令行输入 adb connect" + getLocalIpAddress()+ ":5555");execShell("setprop service.adb.tcp.port 5555");execShell("stop adbd");execShell("start adbd");Toast.makeText(MainActivity.this, "wifi调试已经开启",Toast.LENGTH_SHORT).show();} else {// false时execShell("setprop service.adb.tcp.port 5555");execShell("stop adbd");execShell("start adbd");info.setVisibility(View.GONE);Toast.makeText(MainActivity.this, "wifi调试已经关闭",Toast.LENGTH_SHORT).show();}}});
execShell方法
/** * 发送shell命令 * * @param str */public void execShell(String str) {try {// 权限设置Process p = Runtime.getRuntime().exec("su");// 获取输出流OutputStream outputStream = p.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);// 将命令写入dataOutputStream.writeBytes(str);// 提交命令dataOutputStream.flush();// 关闭流操作dataOutputStream.close();outputStream.close();} catch (Throwable t) {t.printStackTrace();}}
另外我们在点击事件中还使用了getLocalIpAddress()方法来取得本机的ip
/** * 检查网络及获得本机ip * * @return */private String getLocalIpAddress() {WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();// 获取32位整型IP地址int ipAddress = wifiInfo.getIpAddress();// 返回整型地址转换成“*.*.*.*”地址return String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));}/** * 取得IP地址 * @return */public static String getIpAddress() {try {for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {NetworkInterface intf = en.nextElement();for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {InetAddress inetAddress = enumIpAddr.nextElement();if (!inetAddress.isLoopbackAddress()&& inetAddress instanceof Inet4Address) {return inetAddress.getHostAddress().toString();}}}} catch (Exception e) {e.printStackTrace();}return null;}
大概这样就可以使用了,不过还不是很完善,例如我wifi下不同网段,没有判断。或者我启动wifi调试后我忽然没有网络了,也没有处理,所以会导致后面继续使用出问题。不过自己懒得改。
demo下载
0 0
- android-代码里使用shell命令(wifi调试)
- Android中使用代码执行shell命令
- android使用wifi进行调试
- Android Studio使用Wifi调试
- Android Studio 使用wifi调试
- Android使用WiFi adb调试
- android真机调试时使用adb shell命令 windows
- Android Studio使用Wifi调试的方法:使用ADB WIFI
- Android Studio使用Wifi调试的方法:使用ADB WIFI
- Android 如何在java层代码里运行具有root权限的Linux shell命令
- android 执行shell命令代码
- wifi 调试 android 调试
- Android使用WIFI进行远程ADB调试
- Adb使用Wifi 无线调试Android
- 【Android】使用Wifi连接ADB调试App
- 【Android】使用Wifi连接ADB调试App
- 使用WIFI ADB来调试Android程序
- Android studio使用adbwireless实现WiFi调试
- Qt-时间
- KMP算法求next数组
- C++ STL相关容器详解
- Android UsageStatsService:要点解析
- Install Xilinx USB cable drivers for Ubuntu
- android-代码里使用shell命令(wifi调试)
- POJ2112 Optimal Milking 二分法+网络流
- Sql server 无法附加数据库的解决方法
- 而是如何用文化园王海燕文欢迎为何杀人后
- 【文件】文件读写基本API
- hdu 1286 找新朋友
- 字典树(Trie)hdu2846
- 理解Linux和其他UNIX-Like系统上的平均负载
- debian运行goagent遇到的问题及解决方法