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 ;
    }
原文地址:https://www.cnblogs.com/pandans/p/2104261.html