«

PC获取手机截图、复制文件、安装APK

时间:2024-3-2 18:04     作者:韩俊     分类: Android


我在eoe上的帖子的链接

PC获取手机截图、复制文件、安装APK
http://www.eoeandroid.com/thread-324986-1-1.html

上次从网上看到了一个利用ddmlib这这个包从手机抓取图片存放到电脑指定目录的一篇帖子,它是个java项目,自己研究了一下, 写了一个demo ,添加了 从电脑中文件复制到设备、将APK文件安装到设备的功能。(ddmlib.jar这个包在SDK目录下tools中lib文件夹下)

package cc.practise;



import java.text.SimpleDateFormat;



public class Main {

/**

  • @param args

    */

    public static void main(String[] args) {

    DeviceManager dm = new DeviceManager(0); //支持多个手机端设备管理,0表示第一个连接的设备

    dm.getScreenShot("E://screenShot//", "手机截图_"+toDateTime(System.currentTimeMillis()));

    // screenShot.InstallPackage("D://BaiduWenku_Android_10000.apk");

    dm.getFileList();//获取手机存储目录列表

    dm.pullFile("D:\","/mnt/sdcard/","music.aac");//将电脑中D://msuic.aac文件复制到手机/mnt/sdcard/目录中

    dm.InstallPackage("D:\WoChaCha.apk");//将一个apk文件安装到手机中

    }

    //日期的转换

    private static String toDateTime(long time) {

    //初始化Formatter的转换格式。

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");

    return formatter.format(time);

    }

    }

    [/mw_shl_code]





    DeviceManager类

    [mw_shl_code=java,true]package cc.practise;

    import java.awt.image.BufferedImage;

    import java.awt.image.RenderedImage;

    import java.io.File;

    import java.io.IOException;



    import javax.imageio.ImageIO;



    import com.android.ddmlib.AdbCommandRejectedException;

    import com.android.ddmlib.AndroidDebugBridge;

    import com.android.ddmlib.FileListingService;

    import com.android.ddmlib.FileListingService.FileEntry;

    import com.android.ddmlib.IDevice;

    import com.android.ddmlib.InstallException;

    import com.android.ddmlib.RawImage;

    import com.android.ddmlib.ShellCommandUnresponsiveException;

    import com.android.ddmlib.SyncException;

    import com.android.ddmlib.TimeoutException;

    public class DeviceManager {



    public IDevice device ;



    /**
    • 构造函数,默认获取第一个设备

      */

      public DeviceManager(){

      AndroidDebugBridge.init(false);

      device = this.getDevice(0);

      device.getFileListingService();

      System.out.println("设备信息:"+"getAvdName"+device.getAvdName()+"--getName"+device.getAvdName()+"--getSerialNumber"+device.getSerialNumber()+"--getProperty"+device.getProperty("what"));

      fileList=device.getFileListingService();

      }



      /**
    • 构造函数,指定设备序号
    • @param deviceIndex 设备序号

      */

      public DeviceManager(int deviceIndex){

      AndroidDebugBridge.init(false); //

      device = this.getDevice(deviceIndex);

      }



      /**
    • 直接抓取屏幕数据
    • @return 屏幕数据

      */

      public RawImage getScreenShot(){

      RawImage rawScreen = null;

      if(device!=null){

      try {

      rawScreen = device.getScreenshot();

      } 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();

      }

      }else{

      System.err.print("没有找到设备");

      }

      return rawScreen;

      }





      /**

    • 获取图片byte[]数据
    • @return 图片byte[]数据

      */

      public byte[] getScreenShotByteData(){

      RawImage rawScreen = getScreenShot();

      if(rawScreen != null){

      return rawScreen.data;

      }

      return null;

      }





      /**
    • 抓取图片并保存到指定路径
    • @param path 文件路径
    • @param fileName 文件名

      */

      public void getScreenShot(String path,String fileName){

      System.out.println("设备信息:"+"getAvdName"+device.getAvdName()+"--getName:--"+device.getAvdName()+"--getSerialNumber"+device.getSerialNumber()+"--getProperty"+device.getProperty("what"));

      RawImage rawScreen = getScreenShot();

      if(rawScreen!=null){

      Boolean landscape = false;

      int width2 = landscape ? rawScreen.height : rawScreen.width;

      int height2 = landscape ? rawScreen.width : rawScreen.height;

      BufferedImage image = new BufferedImage(width2, height2,

      BufferedImage.TYPE_INT_RGB);

      if (image.getHeight() != height2 || image.getWidth() != width2) {

      image = new BufferedImage(width2, height2,

      BufferedImage.TYPE_INT_RGB);

      }

      int index = 0;

      int indexInc = rawScreen.bpp >> 3;

      for (int y = 0; y < rawScreen.height; y++) {

      for (int x = 0; x < rawScreen.width; x++, index += indexInc) {

      int value = rawScreen.getARGB(index);

      if (landscape)

      image.setRGB(y, rawScreen.width - x - 1, value);

      else

      image.setRGB(x, y, value);

      }

      }

      try {

      ImageIO.write((RenderedImage) image, "PNG", new File(path + "/" + fileName + ".png"));

      } catch (IOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      }

      }

      }



      /**
    • 获取得到device对象
    • @param index 设备序号
    • @return 指定设备device对象

      */

      private IDevice getDevice(int index) {

      IDevice device = null;

      AndroidDebugBridge bridge = AndroidDebugBridge

      .createBridge();// 如果代码有问题请查看API,修改此处的参数值试一下

      waitDevicesList(bridge);

      IDevice devices[] = bridge.getDevices();



      for (int i = 0; i < devices.length; i++) {

      System.out.println(devices.toString());

      }



      if(devices.length < index){

      //没有检测到第index个设备

      System.err.print("没有检测到第" + index + "个设备");

      }

      else

      {

      if (devices.length-1>=index) {

      device = devices[index];

      }

      else

      {

      device = devices[0];

      }

      }

      return device;

      }



      /**
    • 等待查找device
    • @param bridge

      */

      private void waitDevicesList(AndroidDebugBridge bridge) {

      int count = 0;

      while (bridge.hasInitialDeviceList() == false) {

      try {

      Thread.sleep(500);

      count++;

      } catch (InterruptedException e) {

      }

      if (count > 60) {

      System.err.print("等待获取设备超时");

      break;

      }

      }

      }

      public void InstallPackage(String apkFilePath)

      {

      try {

      device.installPackage(apkFilePath, false, "");

      } catch (InstallException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      }

      }

      private FileListingService fileList;

      private FileEntry temp;

      /**
    • 测试打印出存储目录列表
    • @return

      */

      public String[] getFileList()

      {

      fileList=device.getFileListingService();

      FileEntry[] arrayFileEntry;

      try {

      // String str=fileList.getRoot().findChild(fileList.DIRECTORY_SDCARD).getFullPath();

      arrayFileEntry=fileList.getChildrenSync(fileList.getRoot());

      // System.out.println("print story path:"+fileList.getRoot().findChild(fileList.DIRECTORY_SDCARD).getFullPath());

      for (int i = 0; i < arrayFileEntry.length; i++) {

      if(arrayFileEntry.getFullPath().equals("/mnt"))

      {

      System.out.println("我找到mnt目录了!");

      FileEntry[] array=fileList.getChildrenSync(arrayFileEntry);

      if(array!=null)

      for (int j = 0; j < array.length; j++) {

      System.out.println("mnt目录下:"+array[j].getFullPath());

      }

      }

      System.out.println("Path:"+arrayFileEntry.getFullPath());

      }

      } catch (TimeoutException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (AdbCommandRejectedException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (ShellCommandUnresponsiveException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (IOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      }

      return null;

      }





      /**
    • 将一个文件从电脑上复制到手机指定的目录下
    • @param localPath:本地的目录
    • @param remotePath:手机的目录
    • @param fileName:文件名称

      /

      public void pullFile(String localPath,String remotePath,String fileName)

      {



      /
      try {

      FileEntry[] arrayTemp=fileList.getChildrenSync(temp);

      for (int i = 0; i < arrayTemp.length; i++) {

      if(arrayTemp.getFullPath().equals(remotePath))

      {

      System.out.println("I find ttpod path!");

      }else

      {

      System.out.println("没有找到设备中的目录:"+remotePath);

      }

      System.out.println("arrayTemp:"+arrayTemp.getFullPath());

      }/

      try {

      device.pushFile(localPath+fileName,remotePath+fileName);

      } catch (SyncException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (IOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (AdbCommandRejectedException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (TimeoutException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      }

      /
      } catch (SyncException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (IOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (AdbCommandRejectedException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (TimeoutException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (ShellCommandUnresponsiveException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      }*/

      }

      }

标签: android

热门推荐