利用ddmlib 实现 PC端与android手机端adb forword socket通信(转)
上篇文章讲了PC与android手机连接的办法 ,通过java调用系统命令执行adb命令操作,实际上是一个比较笨的办法。
网上查阅资料,发现google 提供了ddmlib库 (adt-bundle\sdk\tools 目录下), 提供了adb相关操作的所有api。
文档参考
参考范例如下
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
利用ddmlib 实现 PC端与android手机端adb forword socket通信(转)的更多相关文章
- TODO monkey笔记,PC端执行和手机端执行
微博不给力啊 吞我笔记,还好我有txt... 1.环境准备:安装Android sdk, 配置环境变量:platfrom_tools,tools,aapt;java:2.查询当前apk信息: aapt ...
- H.264视频在android手机端的解码与播放(转)
随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐.商务应用.金融应用.交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩.快捷便利,也让它成为人们生活中不可取代的一部分.其 ...
- PHP判断客户端是PC web端还是移动手机端方法
PHP判断客户端是PC web端还是移动手机端方法需要实现:判断手机版的内容加上!c550x260.jpg后缀变成缩略图PHP用正则批量替换Img中src内容,用正则表达式获取图片路径实现缩略图功能 ...
- pc端和android端应用程序测试有什么区别?(ps面试题)
pc端和android端应用程序测试有什么区别?(ps面试题) [VIP7]大连-凭海临风(215687736) 2014/4/10 8:56:171.测试环境不同PC平台一般都是windows an ...
- PC端的软件端口和adb 5037端口冲突解决方案
引用https://www.aliyun.com/jiaocheng/32552.html 阿里云 > 教程中心 > android教程 > PC端的软件端口和adb 50 ...
- PC端使用opencv获取webcam,通过socket把Mat图像传输到android手机端
demo效果图: PC端 android端 大体流程 android端是服务器端,绑定IP和端口,监听来自PC端的连接, pc端通过socket与服务器andorid端传输图片. 主要代码 andro ...
- 利用jQuery实现PC端href生效,移动端href失效
今天要写一个功能,记录一下吧.if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){ $('.item-a').attr('href' ...
- pc端前端和手機端區別
1.pc端寬度比較固定,手機端可以橫屏或者豎屏: 2.pc端不需要處理手機觸摸,而手機端需要: 3.pc端不需要處理鍵盤事件: 3.pc的瀏覽器內核很多,手機端基本上是webkit或者是基於webki ...
- Android 手机端自动化测试框架
前言: 大概有4个月没有更新了,因项目和工作原因,忙的手忙脚乱,趁十一假期好好休息一下,年龄大了身体还是扛不住啊,哈哈.这次更新Android端自动化测试框架,也想开源到github,这样有人使用才能 ...
随机推荐
- uva 10054 The Necklace 拼项链 欧拉回路基础应用
昨天做了道水题,今天这题是比较水的应用. 给出n个项链的珠子,珠子的两端有两种颜色,项链上相邻的珠子要颜色匹配,判断能不能拼凑成一天项链. 是挺水的,但是一开始我把整个项链看成一个点,然后用dfs去找 ...
- 基于阿里云ECS的phpwind网站备案前如何远程访问调试?
基于阿里云ECS的phpwind网站部署非常方便,但云主机的外网IP绑定域名却比较复杂.先要申请域名,成功后还需要备案.尤其是企业网站备案,需要提交的资料较多,准备资料以及审批的时间较长.这段时间在外 ...
- 树形菜单复选框级联选择HTML
模块标题 标识符 类别 链接 排序 系统管理 组 1 用户权限设定 Sys_UserModelConfigList 模块 Sys_UserModelConfigList.aspx 1 角色管理 ...
- 文本的输入输出(page52)
2.2.4 再谈输入输出, 所用java类有:Out.java , In.java public class Cat{ public static void main(String[] args){ ...
- 剑指Offer47 不用加减乘除做加法
/************************************************************************* > File Name: 47_AddTwo ...
- hdu3068
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 导出用户列表到Excel的几种方法
最近客户在咨询着怎么把SharePoint上面的用户列表给到出Excel,查看了一下,SharePoint并没有提供直接可用的导出功能(虽然都是List,但就是不让你导出...) 网上搜索了一下,方法 ...
- CSS中的文本属性
本文总结一下CSS中关于文字的相关属性,最后给出实例. CSS基础文字属性 文字的基础属性主要包括:字体.颜色和文本.除去颜色color的属性外,字体和文本的相关属性可以权威参考: CSS 文本属性( ...
- 布料解算插件 Qualoth 重点参数分享
前言 Qualoth是韩国FXGear公司推出的一款布料模拟插件,可以计算出很自然的衣褶以及动态效果,并且能应对大幅度动作的碰撞解算,可以和Houdini的Cloth Solver相媲美: 目前这款插 ...
- iOS开发中遇到的头文件找不到的问题解决办法
有时会遇到莫名其妙的明明有这个文件,但是就是显示头文件找不到,我也是咨询了技术大牛之后知道的这个方法,之后恰巧我一个朋友问我cocoapod加进去之后头文件找不到,我就让他试了下这个方法果然好用,我也 ...