DeviceInfo采集android設(shè)備信息工具

庫(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ù)

扯扯淡

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,741評(píng)論 25 709
  • 文 | 王大可 我的家鄉(xiāng),橫縣,屬?gòu)V西首府南寧市下轄縣。從南寧瑯東汽車站乘坐大巴車,一個(gè)半小時(shí)就能到達(dá)橫縣縣城。 ...
    王大可的觀閱讀 922評(píng)論 2 3
  • 不問過往,不求遠(yuǎn)方。 無論你此刻是忙著快樂,還是忙著生存。 不再執(zhí)著于,每分每秒,密切糾纏,才叫愛。 友情的位置就...
    噓看隕石閱讀 383評(píng)論 3 4
  • 3個(gè)月前,女孩第一次踏入社會(huì),因?yàn)榇笏牡囊荒隂]有課,她就在離家近的地方找到人生中的第一份工作。這份工作收入不高,...
    Estelle洋閱讀 251評(píng)論 6 3

友情鏈接更多精彩內(nèi)容