庫(kù)介紹
功能
采集Android設(shè)備信息,以Json形式輸出
可自由定制要采集的設(shè)備類型,顯示的設(shè)備信息詳情等
特性
- 通過繼承
BaseDeviceInfoCollector類,配合DeviceInfoManager以獲取任意設(shè)備信息 - 通過
DeviceInfoManager管理每個(gè)設(shè)備信息采集器(下簡(jiǎn)稱:Collector),可自由添加Collector,以同時(shí)采集N多種軟硬件設(shè)備信息 - Collector分為自動(dòng)采集和手動(dòng)采集兩種采集方式。
- 自動(dòng)采集:Manager控制自發(fā)進(jìn)行的采集
- 手動(dòng)采集:需要用戶參與交互的數(shù)據(jù)采集過程
- Manager管理的多個(gè)Collector做并發(fā)自動(dòng)采集,手動(dòng)采集可以配置在自動(dòng)采集動(dòng)作結(jié)束后自行開始
- 每個(gè)Collector獨(dú)立管理各自所需要的權(quán)限,在Manager中統(tǒng)一申請(qǐng)(SDK_VERSION >= 23)
- 可選擇獲取所有的模塊的設(shè)備信息(Json),也可以選擇只輸出單一模塊(Json)
- 提供豐富的狀態(tài)回調(diào)接口
DeviceInfoCollectListener,可以監(jiān)聽采集結(jié)束等各種狀態(tài)
輸出示例
- 默認(rèn)輸出:
{
"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"
}]
}
- 自定義設(shè)備信息
DeviceInfoManager.NewInstance(this)
.addCollector(new PhoneBasicInfoCollector(this, "basic")) //Andorid設(shè)備基本信息(PhoneBasicInfoCollector)
.addCollector(new SimInfoCollector(this, "sim")) //Sim卡信息(SimInfoCollector)同時(shí)識(shí)別多張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")) //存儲(chǔ)信息(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")) //系統(tǒng)相關(guān)信息(Build.prop等)
.autoStartManualCollection(true)
.bindListener(mDeviceInfoCollectListener)
.start();
- 當(dāng)然也可以通過重寫每個(gè)Collector的
public String getJsonInfo();以自定義Json的輸出內(nèi)容
目前可獲取的設(shè)備信息(只作為模板用途,建議使用時(shí)自行定制)
- Andorid設(shè)備基本信息(PhoneBasicInfoCollector)
- Sim卡信息(SimInfoCollector)
- 同時(shí)識(shí)別多張Sim卡
- 主板信息(BoardInfoCollector)
- Cpu信息(CpuInfoCollector)
- 電池信息(BatteryInfoCollector)
- 屏幕信息(ScreenInfoCollector)
- NFC信息(NfcInfoCollector)
- 傳感器列表(SensorInfoCollector)
- 攝像頭信息(CameraInfoCollector)
- 存儲(chǔ)信息(RAM & SD)(StorageInfoCollector)
- Ui信息(UiInfoCollector)
- 系統(tǒng)相關(guān)信息(Build.prop等)
如何使用
添加依賴庫(kù)
[https://jitpack.io]
[GitHub issues]
庫(kù)版本號(hào) version 請(qǐng)看上方 JitPack 的最新版本號(hào),如
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抽象類進(jìn)行功能拓展,以采集更多信息,或輸出自定義的Json內(nèi)容
-
public DemoCollector(Context context, String collectorName)中的collectorName -
public abstract boolean needCollectManually();返回自定義Collector是否需要手動(dòng)收集 -
public abstract String[] getRequiredPermissions();返回自定義Collector所需要的權(quán)限(每個(gè)Collector獨(dú)立管理權(quán)限,Manager統(tǒng)一申請(qǐng)) -
protected abstract void doCollectAutomatically();Collector做自動(dòng)采集的方法 -
protected abstract void doCollectManually();Collector做手動(dòng)采集的方法,若采用Manager統(tǒng)一管理,需要needCollectManually()的返回值為true此方法才會(huì)被調(diào)用
package ltns.deviceinfolib.collector;
import android.content.Context;
/**
* @date 創(chuàng)建時(shí)間:2018/1/8
* @author appzy
* @Description
* @version
*/
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管理多個(gè)Collector
為了代碼簡(jiǎn)潔易讀,我把它設(shè)計(jì)成這樣:(不知道這樣寫會(huì)不會(huì)違背什么設(shè)計(jì)模式,如果有請(qǐng)issues告訴我,謝謝:D)
DeviceInfoManager.NewInstance(this)
.addCollector(new BoardInfoCollector(MainActivity.this, "board"))
.addCollector(new SimInfoCollector(MainActivity.this, "sim"))
.autoStartManualCollection(true)
.bindListener(mDeviceInfoCollectListener)
.start();
-
addCollector(BaseDeviceInfoCollector)添加一個(gè)新的Collector到Manager中 -
autoStartManualCollection(boolean)默認(rèn)是true,自動(dòng)采集全部完成后立即開啟手動(dòng)采集隊(duì)列
在DeviceInfoCollectListener中監(jiān)聽采集狀態(tài):
-
mDeviceInfoManager.getDeviceJsonInfo();方法獲取到Manager中所有Collector采集到的信息 -
mCollector.getJsonInfo();方法獲取單個(gè)Collector中的信息 -
void onStart();Manager調(diào)用start()時(shí)回調(diào) -
void onSingleSuccess(BaseDeviceInfoCollector mCollector);當(dāng)有某個(gè)Collector成功采集到信息后回調(diào) -
void onSingleFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo);當(dāng)有某個(gè)Collector采集信息失敗后回調(diào)(并不一定沒有采集到數(shù)據(jù),已經(jīng)采集到的信息仍會(huì)被以Json格式輸出) -
void onAllDone(DeviceInfoManager mDeviceInfoManager);通過addCollector(...)方法添加到Manager中的所有Collector均完成采集動(dòng)作后回調(diào),需要說明的是,不一定是全部采集成功了,只是采集動(dòng)作完成了 -
void onAutoAllDone(DeviceInfoManager mDeviceInfoManager);當(dāng)拋開需要手動(dòng)收集的收集器,其他的收集器全部完成采集動(dòng)作后回調(diào)
注意:
onSingleFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo)中也可能存在數(shù)據(jù),即mCollector.getJsonInfo();也可能會(huì)有數(shù)據(jù),具體原因可參考源碼和下方 注意事項(xiàng)
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單獨(dú)跑也是支持的
(支持但不推薦)
當(dāng)然還是推薦使用Manager :D。就是想要自己?jiǎn)为?dú)跑也可以,接著~
特別說明:Collector單獨(dú)跑需要調(diào)用者自行申請(qǐng)權(quán)限,因此方便起見,推薦使用Manager統(tǒng)一管理
以BoardInfoCollector為例:
BoardInfoCollector mCollector = new BoardInfoCollector(MainActivity.this, "board");
mCollector.bindObserver(mStateObserver);
mCollector.startCollectAutomatically();//啟動(dòng)自動(dòng)采集
mCollector.startCollectManually();//啟動(dòng)手動(dòng)采集
在CollectorStateObserver中監(jiān)聽Collector狀態(tài):
-
void onCollectionSuccess(BaseDeviceInfoCollector mCollector);當(dāng)手動(dòng)采集和自動(dòng)收集均成功完成采集時(shí)調(diào)用 void onCollectionFailure(BaseDeviceInfoCollector mCollector,String mErrorInfo);-
void onManualCollectionSuccess(BaseDeviceInfoCollector mCollector,boolean startNext);當(dāng)手動(dòng)參與的信息收集成功時(shí)調(diào)用。 P.s. 此方法回調(diào)時(shí)會(huì)同時(shí)回調(diào)onCollectionSuccess(),具體看源碼 -
void onManualCollectionFailure(BaseDeviceInfoCollector mCollector,String mErrorInfo,boolean startNext);當(dāng)手動(dòng)參與的信息收集失敗時(shí)調(diào)用。 P.s. 此方法回調(diào)時(shí)會(huì)同時(shí)回調(diào)onCollectionFailure(...) -
void onNeedManualCollect(BaseDeviceInfoCollector mCollector);該采集器需要手動(dòng)采集時(shí)回調(diào),具體回調(diào)時(shí)間請(qǐng)看源碼
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) {
}
};
注意事項(xiàng)
- 多個(gè)Collector的自動(dòng)采集過程是并發(fā)的,運(yùn)行在子線程中;手動(dòng)采集方法運(yùn)行在主線程中
- Manager的監(jiān)聽回調(diào)不一定在主線程,因此若操作涉及線程安全,如更新UI,建議使用
Handler - Manager的
boolean isManualCollectionStartAutomatically默認(rèn)為true,若要更改需要手動(dòng)配置autoStartManualCollection(boolean)為false。若設(shè)置為false,需要調(diào)用startCollectByHand開啟手動(dòng)采集隊(duì)列;當(dāng)然也可以單獨(dú)開啟某個(gè)Collector的手動(dòng)采集 -
onSingleFailure(BaseDeviceInfoCollector mCollector, String mErrorInfo)回調(diào)中通過調(diào)用mCollector.getJsonInfo();方法仍可以獲取到doCollectAutomatically();方法中采集到的自動(dòng)收集部分的設(shè)備信息 - 庫(kù)內(nèi)內(nèi)置了AndPermission庫(kù)以處理權(quán)限相關(guān),Gson以處理Json相關(guān)
- 庫(kù)內(nèi)所有的Collector實(shí)現(xiàn)類只做模板使用,建議使用時(shí)自行繼承
BaseDeviceInfoCollector實(shí)現(xiàn);若要使用庫(kù)內(nèi)Collector,需要在 Manifests.xml 中聲明對(duì)應(yīng)權(quán)限后才能正常使用
更新日志
- 上傳庫(kù),提供Sim&Board信息采集支持,更新README(2017.06.23)
- 添加CPU、設(shè)備基本信息采集支持,更新Sim注釋,發(fā)布v1.0.1(2017.06.23)
- 添加更多信息采集模板類(Battery,NFC,Camera...),統(tǒng)一輸出(Json)中key的命名規(guī)范(2017.06.26)
- 添加了系統(tǒng)描述相關(guān)信息的采集,修改了Demo.apk中的Json的顯示方式(2017.06.29)
感謝
- 庫(kù)內(nèi)使用了 嚴(yán)振杰 的AndPermission庫(kù)
扯扯淡
- 源碼地址:https://github.com/appzy/DeviceInfo
- 如果覺得有用,歡迎Stars