C#通过adb传输安卓设备数据

最近因为项目需要,研究了一下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
这里写图片描述
文件结构

  1. 在程序中最好集成adb.exe,使用起来也很方便
  2. 使用log4net记录数据传输时的返回信息
  3. 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>
        
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值