不需要任何許可權獲得Android裝置的唯一ID,許可權android裝置id

來源:互聯網
上載者:User

不需要任何許可權獲得Android裝置的唯一ID,許可權android裝置id

這個問題來自於Is there a unique Android device ID?
我對這個問題的答案做了整理,包括將另一篇文章加入進來作為補充,可以完美解決此問題。

作者提出的問題:
Android裝置有沒有唯一的id?如果有的話,我怎麼通過java代碼獲得這個id?

答案:
我讀了stack OverStack上每一個答案,Google的開發人員部落格和Android文檔,我認為’Pseudo ID’ 是最好的選擇。

首先先來看看我們為什麼不選用其他的方法:User Email
  • 使用者可以更改他們的email (非常不可靠)

  • API5+需要許可權
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

  • API14+需要許可權
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    (How to get the Android device’s primary e-mail address)
使用者手機號
  • 使用者可以更改他們的手機號 (非常不可靠)

  • 需要許可權<uses-permission android:name="android.permission.READ_PHONE_STATE" />

IMEI
  • 只有Android手機才有, IMEI號是一串15位的號碼,比如像這樣 359881030314356
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);String szImei = TelephonyMgr.getDeviceId(); 
  • 需要許可權<uses-permission android:name="android.permission.READ_PHONE_STATE" />

  • 通常使用者會因為你向他們要了這個許可權而給你一個差評,因為他們覺得你就是在竊取他們的隱私,很明顯,你就是在收集一些資料

Android ID
  • 這個是不靠譜的,因為有時候它是null的,文檔中明確說明,如果你恢複了出廠設定,那他就會改變的。而且如果你root了手機,你也可以改變這個ID
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
  • 它返回的是9774d56d682e549c這樣一串東西,倒是不需要什麼許可權
WLAN MAC地址
  • 這也可以得到一個獨一無二的ID號,返回的是 00:11:22:33:44:55 。但是當沒有wifi的時候,我們是無法獲得資料的。
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
  • 需要許可權android.permission.ACCESS_WIFI_STATE
藍芽MAC地址
  • 市面上大部分的應用不使用藍芽,如果你的應用根本沒用藍芽,而你卻和使用者要了藍芽許可權的,那你很可疑。
BluetoothAdapter m_BluetoothAdapter = null; m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();String m_szBTMAC = m_BluetoothAdapter.getAddress();
  • 需要許可權<uses-permission android:name="android.permission.BLUETOOTH "/>
最合適的辦法:Pseudo-Unique ID
  • API >=9:通過“Build.SERIAL”這個屬性來保證ID的獨一無二。API 9 以上的Android裝置目前市場佔有率在99.5%
    記住:你只在技術上忽略了0.5%的使用者,你可以專註於99.5%的使用者

  • API < 9:我們可以通過讀取裝置的ROM版本號碼、廠商名、CPU型號和其他硬體資訊來組合出一串15位的號碼,這15位號碼有可能重複,但是幾率太小了,小到可以忽略,況且就算重複了,我們損失的使用者最多也只不過是0.5%而已。

String m_szDevIDShort = "35" +             Build.BOARD.length()%10+ Build.BRAND.length()%10 +             Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +             Build.DISPLAY.length()%10 + Build.HOST.length()%10 +             Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +             Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +             Build.TAGS.length()%10 + Build.TYPE.length()%10 +             Build.USER.length()%10 ; //13 位

“35”加上後面的13位一共15位,我們可以得到355715565309247這樣一串號碼,不需要任何的許可權,非常方便。

//獲得獨一無二的Psuedo IDpublic static String getUniquePsuedoID() {       String serial = null;       String m_szDevIDShort = "35" +             Build.BOARD.length()%10+ Build.BRAND.length()%10 +             Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +             Build.DISPLAY.length()%10 + Build.HOST.length()%10 +             Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +             Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +             Build.TAGS.length()%10 + Build.TYPE.length()%10 +             Build.USER.length()%10 ; //13 位    try {        serial = android.os.Build.class.getField("SERIAL").get(null).toString();       //API>=9 使用serial號        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();    } catch (Exception exception) {        //serial需要一個初始化        serial = "serial"; // 隨便一個初始化    }    //使用硬體資訊拼湊出來的15位號碼    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();

最終會得到這樣的一串ID:00000000-28ee-3eab-ffff-ffffe9374e72

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.