DeviceInfo
库介绍
功能
采集 Android 设备信息,以 Json 形式输出
Collect Android device information and output it in the form of Json
可自由定制要采集的设备类型,显示的设备信息详情等
You can freely customize the type of device to be collected, the details of the displayed device information, etc.
特性
- 通过继承
BaseDeviceInfoCollector类,配合DeviceInfoManager以获取任意设备信息 - 通过
DeviceInfoManager管理每个设备信息采集器(下简称:Collector),可自由添加 Collector,以同时采集 N 多种软硬件设备信息 - Collector 分为自动采集和手动采集两种采集方式。
- 自动采集:Manager 控制自发进行的采集
- 手动采集:需要用户参与交互的数据采集过程
- Manager 管理的多个 Collector 做并发自动采集,手动采集可以配置在自动采集动作结束后自行开始
- 每个 Collector 独立管理各自所需要的权限,在 Manager 中统一申请(SDK_VERSION >= 23)
- 可选择获取所有的模块的设备信息(Json),也可以选择只输出单一模块(Json)
- 提供丰富的状态回调接口
DeviceInfoCollectListener,可以监听采集结束等各种状态
输出示例
- 默认输出:
{
"board": {"boardName": "MSM8939"},
"sim": [{
"dataState": "0",
"imsi": "460036820263837",
"isNetworkRoaming": "false",
"networkOperatorName": "China Telecom",
"networkType": "14",
"phoneType": "2",
"simCountryIso": "cn",
"simOperator": "46003",
"simSerialNumber": "89860315844110607274",
"simState": "0"
}]
}
自定义设备信息
DeviceInfoManager.NewInstance(this) .addCollector(new PhoneBasicInfoCollector(this, "basic")) //Andorid 设备基本信息(PhoneBasicInfoCollector) .addCollector(new SimInfoCollector(this, "sim")) //Sim 卡信息(SimInfoCollector)同时识别多张 Sim 卡 .addCollector(new CpuInfoCollector(this, "cpu")) //Cpu 信息(CpuInfoCollector) .addCollector(new BoardInfoCollector(this, "board")) //主板信息(BoardInfoCollector) .addCollector(new BatteryInfoCollector(this, "battery")) //电池信息(BatteryInfoCollector) .addCollector(new StorageInfoCollector(this, "storage")) //存储信息(RAM & SD)(StorageInfoCollector) .addCollector(new CameraInfoCollector(this, "camera", true)) //摄像头信息(CameraInfoCollector) .addCollector(new ScreenInfoCollector(this, "screen")) //屏幕信息(ScreenInfoCollector) .addCollector(new UiInfoCollector(this, "ui")) //Ui 信息(UiInfoCollector) .addCollector(new SensorInfoCollector(this, "sensor")) //传感器列表(SensorInfoCollector) .addCollector(new NfcInfoCollector(this, "nfc")) //NFC 信息(NfcInfoCollector) .addCollector(new SystemInfoCollector(this, "system")) //系统相关信息(Build.prop 等) .autoStartManualCollection(true) .bindListener(mDeviceInfoCollectListener) .start();当然也可以通过重写每个 Collector 的
public String getJsonInfo();以自定义 Json 的输出内容
目前可获取的设备信息(只作为模板用途,建议使用时自行定制)
- Andorid 设备基本信息(PhoneBasicInfoCollector)
- Sim 卡信息(SimInfoCollector)
- 同时识别多张 Sim 卡
- 主板信息(BoardInfoCollector)
- Cpu 信息(CpuInfoCollector)
- 电池信息(BatteryInfoCollector)
- 屏幕信息(ScreenInfoCollector)
- NFC 信息(NfcInfoCollector)
- 传感器列表(SensorInfoCollector)
- 摄像头信息(CameraInfoCollector)
- 存储信息(RAM & SD)(StorageInfoCollector)
- Ui 信息(UiInfoCollector)
- 系统相关信息(Build.prop 等)
如何使用
添加依赖库
库版本号 version 请看上方 JitPack 的最新版本号,如
v1.0.2,并不是 ~xxx~ (推荐使用最新版)
Gradle
Step 1.Add it in your root build.gradle at the end of repositories
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }Step 2.Add the dependency
dependencies { compile 'com.github.guyuepeng:DeviceInfo:xxx' }
Maven
Step 1.Add it in your root build.gradle at the end of repositories
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>Step 2.Add the dependency
<dependency> <groupId>com.github.guyuepeng</groupId> <artifactId>DeviceInfo</artifactId> <version>xxx</version> </dependency>
使用方法
拓展自定义 Collector
通过继承BaseDeviceInfoCollector抽象类进行功能拓展,以采集更多信息,或输出自定义的 Json 内容
public DemoCollector(Context context, String collectorName)中的collectorNamepublic abstract boolean needCollectManually();返回自定义 Collector 是否需要手动收集public abstract String[] getRequiredPermissions();返回自定义 Collector 所需要的权限(每个 Collector 独立管理权限,Manager 统一申请)protected abstract void doCollectAutomatically();Collector 做自动采集的方法protected abstract void doCollectManually();Collector 做手动采集的方法,若采用 Manager 统一管理,需要needCollectManually()的返回值为true此方法才会被调用
package ltns.deviceinfolib.collector;
import android.content.Context;
/**
* @date 创建时间:2018/1/8
* @author appzy
* @Description
* @version v1.0.1
*/
public class DemoCollector extends BaseDeviceInfoCollector {
public DemoCollector(Context context, String collectorName) {
super(context, collectorName);
}
@Override
public boolean needCollectManually() {
return false;
}
@Override
public String[] getRequiredPermissions() {
return new String[0];
}
@Override
protected void doCollectAutomatically() {
}
@Override
protected void doCollectManually() {
}
}
通过 Manager 管理多个 Collector
为了代码简洁易读,我把它设计成这样:(不知道这样写会不会违背什么设计模式,如果有请 issues 告诉我,谢谢:D)
DeviceInfoManager.NewInstance(this)
.addCollector(new BoardInfoCollector(MainActivity.this, "board"))
.addCollector(new SimInfoCollector(MainActivity.this, "sim"))
.autoStartManualCollection(true)
.bindListener(mDeviceInfoCollectListener)
.start();
addCollector(BaseDeviceInfoCollector)添加一个新的 Collector 到 Manager 中autoStartManualCollection(boolean)默认是 true,自动采集全部完成后立即开启手动采集队列
在 DeviceInfoCollectListener 中监听采集状态:
mDeviceInfoManager.getDeviceJsonInfo();方法获取到 Manager 中所有 Collector 采集到的信息mCollector.getJsonInfo();方法获取单个 Collector 中的信息void onStart();Manager 调用 start()时回调void onSingleSuccess(BaseDeviceInfoCollector mCollector);当有某个 Collector 成功采集到信息后回调void onSingleFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo);当有某个 Collector 采集信息失败后回调(并不一定没有采集到数据,已经采集到的信息仍会被以 Json 格式输出)void onAllDone(DeviceInfoManager mDeviceInfoManager);通过 addCollector(...)方法添加到 Manager 中的所有 Collector 均完成采集动作后回调,需要说明的是,不一定是全部采集成功了,只是采集动作完成了void onAutoAllDone(DeviceInfoManager mDeviceInfoManager);当抛开需要手动收集的收集器,其他的收集器全部完成采集动作后回调
注意:
onSingleFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo)中也可能存在数据,即mCollector.getJsonInfo();也可能会有数据,具体原因可参考源码和下方 注意事项
private DeviceInfoCollectListener mDeviceInfoCollectListener = new DeviceInfoCollectListener() {
@Override
public void onStart() {
}
@Override
public void onSingleSuccess(BaseDeviceInfoCollector mCollector) {
//mCollector.getJsonInfo();
}
@Override
public void onSingleFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo) {
//mCollector.getJsonInfo();
}
@Override
public void onAllDone(DeviceInfoManager mDeviceInfoManager) {
// mDeviceInfoManager.getDeviceJsonInfo();
}
@Override
public void onAutoAllDone(DeviceInfoManager mDeviceInfoManager) {
}
};
Collector 单独跑也是支持的
(支持但不推荐)
当然还是推荐使用 Manager :D。就是想要自己单独跑也可以,接着~
特别说明:Collector 单独跑需要调用者自行申请权限,因此方便起见,推荐使用 Manager 统一管理
以BoardInfoCollector为例:
BoardInfoCollector mCollector = new BoardInfoCollector(MainActivity.this, "board");
mCollector.bindObserver(mStateObserver);
mCollector.startCollectAutomatically();//启动自动采集
mCollector.startCollectManually();//启动手动采集
在CollectorStateObserver中监听 Collector 状态:
void onCollectionSuccess(BaseDeviceInfoCollector mCollector);当手动采集和自动收集均成功完成采集时调用void onCollectionFailure(BaseDeviceInfoCollector mCollector,String mErrorInfo);void onManualCollectionSuccess(BaseDeviceInfoCollector mCollector,boolean startNext);当手动参与的信息收集成功时调用。 P.s. 此方法回调时会同时回调 onCollectionSuccess(),具体看源码void onManualCollectionFailure(BaseDeviceInfoCollector mCollector,String mErrorInfo,boolean startNext);当手动参与的信息收集失败时调用。 P.s. 此方法回调时会同时回调 onCollectionFailure(...)void onNeedManualCollect(BaseDeviceInfoCollector mCollector);该采集器需要手动采集时回调,具体回调时间请看源码
private CollectorStateObserver mStateObserver=new CollectorStateObserver() {
@Override
public void onCollectionSuccess(BaseDeviceInfoCollector mCollector) {
}
@Override
public void onCollectionFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo) {
}
@Override
public void onManualCollectionSuccess(BaseDeviceInfoCollector mCollector, boolean startNext) {
}
@Override
public void onManualCollectionFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo, boolean startNext) {
}
@Override
public void onNeedManualCollect(BaseDeviceInfoCollector mCollector) {
}
};
注意事项
- 多个 Collector 的自动采集过程是并发的,运行在子线程中;手动采集方法运行在主线程中
- Manager 的监听回调不一定在主线程,因此若操作涉及线程安全,如更新 UI,建议使用
Handler - Manager 的
boolean isManualCollectionStartAutomatically默认为 true,若要更改需要手动配置autoStartManualCollection(boolean)为 false。若设置为 false,需要调用startCollectByHand开启手动采集队列;当然也可以单独开启某个 Collector 的手动采集 onSingleFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo)回调中通过调用mCollector.getJsonInfo();方法仍可以获取到doCollectAutomatically();方法中采集到的自动收集部分的设备信息- 库内内置了AndPermission库以处理权限相关,Gson以处理 Json 相关
- 库内所有的 Collector 实现类只做模板使用,建议使用时自行继承
BaseDeviceInfoCollector实现;若要使用库内 Collector,需要在 Manifests.xml 中声明对应权限后才能正常使用
更新日志
- 上传库,提供 Sim&Board 信息采集支持,更新 README(2018.06.23)
- 添加 CPU、设备基本信息采集支持,更新 Sim 注释,发布 v1.0.1(2018.06.23)
- 添加更多信息采集模板类(Battery,NFC,Camera...),统一输出(Json)中 key 的命名规范(2018.06.26)
- 添加了系统描述相关信息的采集,修改了 Demo.apk 中的 Json 的显示方式(2018.06.29)
感谢
- 库内使用了 严振杰 的AndPermission库
扯扯淡
- 源码地址:https://github.com/appzy/DeviceInfo
如果觉得有用,欢迎 Stars
If you find it useful, welcome to Stars
