最近因为项目需要,研究了一下C#调用adb传输和推送数据到安卓设备上。 查了资料发现安卓设备与电脑连接,传输数据有两种方式: 1.通过adb
2.socket。 市面上安卓设备管理工具如:豌豆荚、XX手机助手大多采用socket方式,监听某个端口,通过socket传输数据。socket优点是速度快,不会被语言和编码限制,缺点是开发量大,难懂(至少对于大多数开发者是这样的)。
下面介绍一下adb使用的一些经验和技巧,文章最后附有我写的一个程序。
1.ADB简介及命令
ADB:Android Debug Bridge,安卓调试桥接工具。(连接设备时要保证pc上安装有该设备的驱动)
传输数据文件常用的命令有:
- adb shell 进入shell界面
- pull拷贝文件到电脑: pull sdcard/a.jpg d:\a.jpg
- push拷贝文件到设备:push d:\a.jpg sdcard/a.jpg
- mkdir创建文件夹:mkdir xxx mkdir –p xxx/xxx(递归创建文件夹)
- ls 列出当前文件夹下所有文件和文件夹 *
cd转到指定文件夹下
进入shell
转到目录,列出目录中的文件和文件夹
pull、push命令不必进入shell
创建文件夹
*由于cmd字符集的问题,汉字命名的文件在ls时出现乱码,原因是cmd采用gbk,Android系统采用的UTF-8所致,可以更改字符集和展示字体,见此。Ps:在程序中推荐大家使用英文和数字来命名文件和文件夹,免得出现不必要的辛苦,因为通过修改命名方式和修改Android底层adb的源码再次编译相比,真是不要太简单!
2.C#程序
首先说明一下我的开发环境:VS2010 .Net Framework 4.0
文件结构
- 在程序中最好集成adb.exe,使用起来也很方便
- 使用log4net记录数据传输时的返回信息
- ProcessHelper类用来监控cmd进程中输入输出流等
贴一下ProcessHelper类的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Text;
using System.Threading;
namespace AndroidDataTransform
{
public class ProcessHelper
{
private static Process GetProcess()
{
var mProcess = new Process();
mProcess.StartInfo.CreateNoWindow = true;
mProcess.StartInfo.UseShellExecute = false;
mProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
mProcess.StartInfo.RedirectStandardInput = true;
mProcess.StartInfo.RedirectStandardError = true;
mProcess.StartInfo.RedirectStandardOutput = true;
mProcess.StartInfo.StandardOutputEncoding = Encoding.UTF8;
return mProcess;
}
private static string ReadStandardOutputLine(Process p)
{
var tmp = new StringBuilder();
//当下一次读取时,Peek可能为-1,但此时缓冲区其实是有数据的。正常的Read一次之后,Peek就又有效了。
if (p.StandardOutput.Peek() == -1)
tmp.Append((char)p.StandardOutput.Read());
while (p.StandardOutput.Peek() > -1)
{
tmp.Append((char)p.StandardOutput.Read());
}
return tmp.ToString();
}
/// <summary>
/// 读取数据的时候等待时间,等待时间过短时,可能导致读取不出正确的数据。
/// </summary>
public static int WaitTime = 50;
/// <summary>
/// 连续运行模式,支持打开某程序后,持续向其输入命令,直到结束。
/// </summary>
/// <param name="exePath"></param>
/// <param name="args"></param>