「博客搬家」 原地址: CSDN 原發(fā)表時(shí)間: 2016-04-15
本文轉(zhuǎn)載自:難題:識(shí)別獨(dú)立安卓設(shè)備 - 「A WING BY WIND」
今天碰巧朋友問(wèn)到我怎么識(shí)別獨(dú)立的安卓手機(jī)鲁豪,就花了一些時(shí)間琢磨了一下啄刹。其實(shí)這個(gè)問(wèn)題可以秒答,就是 IMEI 蚜枢。
TelephonyManager.getDeviceId();
這需要一個(gè)權(quán)限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
問(wèn)題如果這么簡(jiǎn)單就好了对竣,問(wèn)題在于:
- 平板等其他設(shè)備利虫,無(wú) SIM 卡朗涩,因此無(wú) Telephony 模塊取视。
- 有些設(shè)備恢復(fù)出廠設(shè)置的操作會(huì)清空 IMEI「水貨硬解通常會(huì)導(dǎo)致這個(gè)結(jié)果」
- 我國(guó)許多山寨手機(jī)廠商偷懶鬼雀,刷機(jī)不改 IMEI顷窒,所以 IMEI 都是一樣的
因此其實(shí)問(wèn)題從這里才開始。網(wǎng)上能夠搜索到的解決方案有以下幾點(diǎn):
1. WIFI MAC
一個(gè)方案是優(yōu)先采用 IMEI,當(dāng) IMEI 相同時(shí)鞋吉,再比較 WIFI 的 MAC 地址鸦做。但如果手機(jī)沒有 WIFI 功能或者 WIFI 功能沒有開啟「飛行模式」,則無(wú)法獲取到 MAC 地址谓着。更加讓人惆悵的是泼诱,我國(guó)大山寨廠商實(shí)在是懶透了,無(wú)線網(wǎng)卡的 MAC 地址居然也不修改赊锚,不少自刷機(jī)的也是這病情「例如這個(gè)治筒,這個(gè)還有這個(gè)」。至于說(shuō)藍(lán)牙 MAC 地址就更別說(shuō)了舷蒲。IMEI 重復(fù)的病因耸袜,與 MAC 地址相同的其實(shí)是一個(gè)原因,都是刷機(jī)或山寨牲平,所以這「WIFI MAC」地址的方案其實(shí)算不上互補(bǔ)了堤框,必須另謀途徑。
2. Serial NO
另一個(gè)方案是用 serial NO 纵柿。這個(gè)值僅在 Android 2.3 版本以上才提供支持胰锌。通過(guò) adb 可以這樣查看:
adb shell getprop ro.serialno
代碼中可使用系統(tǒng)變量 android.os.Build.SERIAL
訪問(wèn)。如果這個(gè)值能夠取到這是僅次于 IMEI 的最好方法了藐窄。缺點(diǎn)是這個(gè)值在 2.2 及以下版本的 Android 系統(tǒng)不支持资昧。不過(guò)好在如今的安卓世界 2.2 及以下的占有率已經(jīng)越來(lái)越低了,翻新速度很快荆忍,因此這個(gè)值很值得一試格带。
3. Android ID
其實(shí)安卓系統(tǒng)提供了 Settings.Secure.ANDROID_ID
來(lái)獲取唯一設(shè)備號(hào)。
import android.provider.Settings.Secure;
private String android_id = Secure.getString(
getContext().getContentResolver(),
Secure.ANDROID_ID);
但同樣 2.2 以前的系統(tǒng)支持得不好刹枉。這個(gè)值是系統(tǒng)初次啟動(dòng)后生成的叽唱,因此恢復(fù)出廠設(shè)置后這個(gè)值會(huì)變,導(dǎo)致觀測(cè)到的設(shè)備數(shù)虛高微宝。在手機(jī)刷機(jī)棺亭、重置頻繁的環(huán)境,這個(gè)值是不靠譜的蟋软。另外某大廠生產(chǎn)的設(shè)備居然有個(gè) BUG镶摘,這個(gè)值是會(huì)重復(fù)的「DROID2」,因此這個(gè)值還是別用為好岳守。
4. Generated UUID
最后還有一個(gè)自己生成 UUID 的辦法凄敢,保存這個(gè) ID,每次訪問(wèn)服務(wù)器時(shí)上傳湿痢,自己告訴系統(tǒng)自己是誰(shuí)涝缝。這個(gè)方法比所有硬件方法都更不靠譜,因?yàn)橹恍栊遁d軟件和清理數(shù)據(jù)就會(huì)導(dǎo)致這個(gè)值被刪除,從而產(chǎn)生新的 UUID拒逮,造成觀測(cè)到的設(shè)備數(shù)量虛高罐氨。更別說(shuō)刷機(jī)和恢復(fù)出廠設(shè)置了。這個(gè)方法非常適合用來(lái)統(tǒng)計(jì)軟件安裝次數(shù)滩援,而非獨(dú)立設(shè)備數(shù)岂昭。
5. 結(jié)論
綜上所述,目前為止我還沒找到非常完美的統(tǒng)計(jì)獨(dú)立設(shè)備的方案狠怨,尤其是在中國(guó)這個(gè)水貨、硬解邑遏、山寨佣赖、刷機(jī)市場(chǎng)泛濫和不規(guī)范的安卓世界,更是難上加難记盒。
但是反過(guò)來(lái)想憎蛤,是不是一臺(tái)完全刷新,安裝了全新的 ROM 的手機(jī)纪吮,就已經(jīng)不是原來(lái)的那臺(tái)手機(jī)了呢俩檬?統(tǒng)計(jì)獨(dú)立設(shè)備數(shù)的目的究竟是什么?如果要的是獨(dú)立活躍設(shè)備數(shù)碾盟,其實(shí)用自己生成的 UUID 已經(jīng)足夠棚辽,因?yàn)樵瓉?lái)使用的那個(gè) UUID 已經(jīng)失去活性,可以忽略了冰肴。對(duì)于 APP 開發(fā)者而言這個(gè)情況與用戶換了一臺(tái)手機(jī)屈藐,完全棄用舊手機(jī)的情況其實(shí)是一樣的。假如是采取活躍 UUID 的方式熙尉,則即使是使用 ANDROID_ID 或者自己生成的 UUID 都是可取的做法了联逻。