`
tohsj0806
  • 浏览: 20619 次
  • 性别: Icon_minigender_2
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

android手机信息采集

阅读更多
1> 建立/断开设备连接

图像采集 和 dump采集 都需要与设备连接后使用,我们通过adb提供的连接了实现,取得Device。

在通过adb与手机建立连接的过程中,我们使用以下的接口:
Device my_getDevice() ;   

boolean my_startViewServer(Device device) ;  

boolean my_stopViewServer(Device device) ;   

其中,端口映射 建立/取消 也在 开启/关闭 的 接口中进行了封装,不再需要手工干预。

package yafeng.test;


import com.android.ddmlib.AndroidDebugBridge;
import com.android.ddmlib.Device;
import com.android.hierarchyviewer.device.DeviceBridge;

public class device_deal {
   
    public static boolean viewServer_started = false ;

  
    public static Device my_getDevice(){   
       
        AndroidDebugBridge.terminate();   
       
        Device device = null ;
       
        Device[] devices = null;
       
        while(null==devices || 0==devices.length){   
           
            System.out.println("rebuilt DeviceBridge connect......");
           
            DeviceBridge.initDebugBridge() ;   
           
            devices = DeviceBridge.getDevices() ;
           
            System.out.println("rebuilt DeviceBridge result is : "+devices);
        }   

           
        device = devices[0] ;
       
        return device ;
       
    }
   
   
   
    public static boolean my_startViewServer(Device device){
       
        int port = 0 ;
       
        while(4939!=port){
           
            System.out.println("start forward port to 4939......");
           
            DeviceBridge.setupDeviceForward(device) ;
           
            port = DeviceBridge.getDeviceLocalPort(device) ;
           
            System.out.println("forward result is port : "+port);
        }
       
        while(!viewServer_started){
           
            System.out.println("start view server ......") ;
           
            viewServer_started = DeviceBridge.startViewServer(device) ;
           
            System.out.println("start view server result is "+viewServer_started) ;
        }
       
        return viewServer_started ;
       
    }
   
   
   
    public static boolean my_stopViewServer(Device device){
       
        boolean result ;
       
        result = DeviceBridge.stopViewServer(device) ;
       
      
       if(false==result){
           
            DeviceBridge.removeDeviceForward(device) ;
        }
       
        return result ;
       
    }
  
}

2> 图像采集

    ImageData getDeviceImage(Device mDevice) ;    

    ImageData 类型封装了我们需要的所有图像信息。其中我们使用其

    public byte data[];

    属性涵盖了图像的像素矩阵信息。
    (320*480像素的图像,其data数组的大小是320*480*3+480  byte),
      每个像素由3个色素(红值,绿值和蓝值)构成,且每行行首有1个行标识字节。

    我们操作的图像对比就是操作这个data数组,具体的各种对比策略(如何操作这个data)是在详细设计中细化。

   
    public ImageData getDeviceImage(Device mDevice){

        RawImage rawImage;
        try
        {
            rawImage = mDevice.getScreenshot();
        }
        catch(Exception ioe)
        {
            System.out.println(ioe.getMessage());
            return null;
        }
        if(rawImage == null)
        {
            return null;
        } else
        {     
            PaletteData palette = new PaletteData(65280, 16711680, -16777216);
            ImageData imageData = new ImageData(rawImage.width, rawImage.height, rawImage.bpp, palette, 1, rawImage.data);

            return imageData ;
         
        }
       
    }

    由于图像采集不是很稳定(经常采集到null),所以得重复采集,如果一定次数(20次)后还是采集不到,那么就断开此次设备连接,重新建立连接,再做上述的采集。(当然,如果连接也不是100%成功,也得判断/重复 连接)。

    例如:
  
    while(null==imageData ){
           
            imageData = getDeviceImage(device) ;
           
            i++ ;
           
            if(i>=20){   
               
                device = device_deal.my_getDevice() ;
               
                i = 0 ;
            }
        }

3> dump信息采集

      ViewNode get_rootView(Device device,Window window) ;  

      void absolute_compute(ViewNode node) ;   


     
      import com.android.hierarchyviewer.device.Window;
      import com.android.hierarchyviewer.scene.ViewHierarchyLoader;
      import com.android.hierarchyviewer.scene.ViewHierarchyScene;
      import com.android.hierarchyviewer.scene.ViewNode;

      public ViewNode get_rootView(Device device,Window window){

            ViewNode vn = null ;
            ViewHierarchyScene vhs = null ;

            vhs = ViewHierarchyLoader.loadScene(device,window) ;

            if(null!=vhs){

                vn = vhs.getRoot() ;
            }

            return vn ;
      }

然后就可以从root组件开始,遍历整个布局/组件信息。以下的例子是一个解析的示例:
   
      public void absolute_compute(ViewNode node){   
       
        if( 0!=node.children.size() ){
           
            for(int i=0;i<node.children.size();i++){
               
                absolute_compute( (ViewNode)(node.children.get(i)) ) ;  
            }   
        }
       
       
        int x = node.left;
        int y = node.top;
       
      
        ViewNode p = node.parent;
        while (p != null) {
            x += p.left - p.scrollX;
            y += p.top - p.scrollY;
            p = p.parent;
        }
       
        System.out.println("the "+node.name+" 's left_top absolute position x:"+x+" and y:"+y+" ,the size is: "+node.width+"*"+node.height+"n") ;
       
        return ;
    }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics