zoukankan      html  css  js  c++  java
  • android手机信息采集

    android手机信息采集

     (2010-01-07 16:26:36)
    标签: 

    杂谈

    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 ;
        }
  • 相关阅读:
    如何在一个页面调用另一个页面
    CSS3新增的选择器和属性
    js中函数和方法的区别
    jQuery中哪几种选择器
    关于JS数组的栈和队列操作
    HDU1232 畅通工程(并查集)
    并查集
    有关素数的基础算法
    二分教室
    蚂蚁下桥(思维)
  • 原文地址:https://www.cnblogs.com/pandans/p/2104261.html
Copyright © 2011-2022 走看看