ddmlib问题总结——同步获取设备信息

通过IDevice.getProperty(String name)得到响应的设备属性。
在实际的使用过程中发现,我的manufacturer总是获取不到,为null(获取代码如下),而剩下的属性都可以获取到,经过测试,如果将manufacturer放在下面,第一个属性总是获取不到,于是到方法定义处查看注释

// 得到指定的设备属性        manufacturer = device.getProperty(IDevice.PROP_DEVICE_MANUFACTURER);    // 这个属性总是无法获取,如果将它和model换一下位置,那么变成model为null
model = device.getProperty(IDevice.PROP_DEVICE_MODEL);
version = device.getProperty(IDevice.PROP_BUILD_VERSION);
apiLevel = device.getProperty(IDevice.PROP_BUILD_API_LEVEL);

观察IDevice.getProperty()的定义:

/**
* Convenience method that attempts to retrieve a property via
* {@link #getSystemProperty(String)} with minimal wait time, and swallows exceptions.
*
* @param name the name of the value to return.
* @return the value or <code>null</code> if the property value was not immediately available
*/
@Nullable
String getProperty(@NonNull String name);

注释大意:利用getSystemProperty()方法在最短的等待时间内获得一个设备属性,如果在这个瞬间该属性是不可用的,则返回null。

应该大致可以定位原因了:1.本方法为异步方法,2.默认等待时间过短

再观察一下IDevice的子类Device的重写方法:

Future<String> future = mPropFetcher.getProperty(name);return future.get(GET_PROP_TIMEOUT_MS, TimeUnit.MILLISECONDS);

其中future.get(long timeout, TimeUtil unit)方法比较特殊:

/**
* Waits if necessary for at most the given time for the computation
* to complete, and then retrieves its result, if available.
*
* @param timeout the maximum time to wait
* @param unit the time unit of the timeout argument
* @return the computed result
* @throws CancellationException if the computation was cancelled
* @throws ExecutionException if the computation threw an
* exception
* @throws InterruptedException if the current thread was interrupted
* while waiting
* @throws TimeoutException if the wait timed out
*/
V get(long timeout, TimeUnit unit)
   throws InterruptedException, ExecutionException, TimeoutException;

该方法将会等待timeout长度的时间,直到你需要的属性可用未知。

根据我们上边定位出来的两个原因:

1.本方法为异步方法,2.默认等待时间过短

可以有两种解决方法:

1.改为同步获取

使用IDevice的getPropertySync(String name)方法来强制同步获取,不过在代码注释中该方法已经被放弃使用了,我没有试过这种方式。

2.增加默认等待时间

适用于可以修改代码的同学:

private static final long GET_PROP_TIMEOUT_MS = 100;  // 从100改为1000
时间: 2024-10-14 17:08:46

ddmlib问题总结——同步获取设备信息的相关文章

PhoneGap获取设备信息

一. 获取设备信息的方法列表(如果没有或者检测不出来就显示undefined) 1.device.name              设备名称(一些国产机检测不出来) 2.device.model     :返回设备的模型或产品的名称 3.device.cordova           PhoneGap 版本 4.device.platform         设备平台 5.device.uuid               uuid 编码(这个编码是设备的唯一编码相当于每部手机的身份证,比较

微信小程序把玩(三十八)获取设备信息 API

原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx.onAccelerometerChange, 罗盘数据wx.onCompassChange wxml <button type="primary" bindtap="getNetWorkType">获取网络类型</button> <butt

android获取设备信息

public class DeviceInfo { private static Application APP = null; private static String sd_card = Environment.getExternalStorageDirectory()+File.separator+"wlcache"; public static Application getApp() { return APP; } // 获取手机型号 public static Strin

小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载五(使用PhoneGap获取设备信息)

除了能够将HTML页面打包成可以直接安装运行的APP外,PhoneGap的一个最大优势在于可以通过JavaScript调用设备来访问设备上的硬件信息,从而实现一些原本只有依靠原生SDK才能够达到的目的.范例5-1就展示了一个利用API来获取设备信息的例子. [范例5-1 利用PhoneGap获取设备信息] <!DOCTYPE html> <html> <meta http-equiv="Content-Type" content="text/ht

Android 获取设备信息 异常

/**获取设备信息 * @param c * @return */ public static void setDeviceInfo(Context c,RequestParams params){ TelephonyManager tm = (TelephonyManager) c.getSystemService(Context.TELEPHONY_SERVICE); if(tm!=null){ try{ params.add("deviceId", tm.getDeviceId(

Android USB API获取设备信息失败问题

在华为荣耀的盒子验证openni的程序,发现orbbec的3d摄像头一直无法使用,一直卡在 设备找不到的提示. 开始从下面2个方面验证:1.验证openni的本身自带的SimpleRead程序,看看是否正常读取到设备信息和depth 图.2.验证Android层usb权限控制问题. 经过验证发现openni自带的c++的可执行程序,可以正常读取到设备信息和depth 图.由此推测 orbbec 3d的驱动和openni的这块部分没有什么问题.问题可能出在Android层的usb权限和获取设备信息

Flutter 中获取设备信息 以及 获取地 理位置

一.Flutter 中获取设备信息 https://pub.dev/packages/device_info 设备信息代码 import 'package:flutter/material.dart';import 'package:device_info/device_info.dart'; class DevicPage extends StatefulWidget{ DevicPage({Key key}); _DevicPage createState() => _DevicPage()

获取设备信息

mark下如何获取设备相关的信息 NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; // app名称 NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"]; // app版本 NSString *app_Version = [infoDictionary objectForKey:@"CFBu

[转载]iOS开发:获取设备信息

开发iOS平台的应用的时候,可以获取iOS设备的设备信息,包括设备的名称,设备的机型,设备的iOS版本等等.设备信息主要来自 UIDevice 类. UIDevice *currentDevice = [UIDevice currentDevice]; NSString *strName = currentDevice.name; //设备名称 NSString *strModel = currentDevice.model; //设备类别 NSString *strLocalizedModel