Android 如何獲取設(shè)備唯一標(biāo)識(shí)
一. 先簡(jiǎn)單總結(jié)一下比較常見(jiàn)的幾個(gè)解決方案的弊端:
1. IMEI
Android 10 中官方明確說(shuō)明第三方應(yīng)用無(wú)法獲取到IMEI碼:Android 10 中的隱私權(quán)變更,
Android 10 以下的版本,需要申請(qǐng)READ_PHONE_STATE權(quán)限。
2. Android ID
Android ID 不具有真正的唯一性,
ROOT、刷機(jī)、恢復(fù)出廠設(shè)置、不同簽名的應(yīng)用等都會(huì)導(dǎo)致獲取的 Android ID 發(fā)生改變,
并且不同廠商定制的系統(tǒng)的BUG會(huì)導(dǎo)致不同的設(shè)備可能會(huì)產(chǎn)生相同的 Android ID。
3. MAC地址
Android 10 中 MAC地址具有隨機(jī)化的特征:Android 10 中的隱私權(quán)變更—MAC地址,
雖然目前大部分手機(jī)還不支持這個(gè)特性,但是隨著廠商的跟進(jìn),這個(gè)方案就會(huì)逐漸作廢
在上面這些設(shè)備自帶的標(biāo)識(shí)不夠滿足需求時(shí),我們就要采用另外的方法了。
二. uuid + 本地文件,實(shí)現(xiàn)一個(gè)通用解決方案
1. 思路
啟動(dòng)APP時(shí),檢查并讀取根目錄下保存有uuid的文件,若沒(méi)有該文件,則視為一臺(tái)新設(shè)備,創(chuàng)建文件并寫(xiě)入uuid。
并且要確保卸載應(yīng)用時(shí),該文件不會(huì)被系統(tǒng)攜帶著刪除(這也是為什么要在根目錄下創(chuàng)建的原因)。
2. 解決手機(jī)訪問(wèn)SDK權(quán)限問(wèn)題
Android 6 以下,添加權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Android 6 及其以上,則需要在此基礎(chǔ)上申請(qǐng)動(dòng)態(tài)權(quán)限。
Android 10 及其以上,文件存儲(chǔ)機(jī)制修改成了沙盒模式,即應(yīng)用只能訪問(wèn)自己沙盒下的文件和公共媒體文件。
“得益”于沙盒機(jī)制,應(yīng)用創(chuàng)建的文件屬于自己的沙盒,那么當(dāng)應(yīng)用卸載時(shí),也會(huì)隨之刪除。
目前可以添加以下一行代碼解決沙盒問(wèn)題:
<application ... android:requestLegacyExternalStorage="true">
這樣我們就能在“根目錄”創(chuàng)建自己文件了。
3. 適配 Android 11
Android 11 會(huì)強(qiáng)制執(zhí)行沙盒模式,在這之前存儲(chǔ)權(quán)限可以簡(jiǎn)單的分為“禁止”和“允許”,在這之后存儲(chǔ)權(quán)限可以簡(jiǎn)單的分為“禁止”、“允許訪問(wèn)媒體文件”和“允許訪問(wèn)所有文件”。
“允許訪問(wèn)媒體文件”這是絕大多數(shù)應(yīng)用能夠申請(qǐng)到的,而“允許訪問(wèn)所有文件”只有文件管理類應(yīng)用可以申請(qǐng)到。假如你不是該類應(yīng)用但又申請(qǐng)了該權(quán)限,那么就會(huì)通不過(guò)Google Play的審核。
允許訪問(wèn)所有文件:android.permission.MANAGE_EXTERNAL_STORAGE
介紹到這兒,其實(shí)一個(gè)方案已經(jīng)出來(lái)了:直接申請(qǐng)“允許訪問(wèn)所有文件”權(quán)限,后果就是不能通過(guò)Google Play的審核。
另外還有一個(gè)辦法:我們暫時(shí)不升級(jí)SDK,針對(duì) Android 10 (SDK 29)來(lái)開(kāi)發(fā)應(yīng)用,這樣的話由于“向后兼容機(jī)制”,我們的應(yīng)用是能夠正常跑在 Android 11 系統(tǒng)上的。
4. Flutter 代碼實(shí)踐
import 'dart:io'; import 'package:uuid/uuid.dart'; // 本地持久化存儲(chǔ)uuid代碼實(shí)踐 class Storage { static File file; // 入口 static Future<String> init() async { bool boolCreateFile = await createFile(); if (boolCreateFile) { String uuid = await readData(); return uuid; } else { await writeData(); String uuid = await readData(); return uuid; } } // 創(chuàng)建文件 static Future<bool> createFile() async { file = File('/storage/emulated/0/uuid.ini'); // 指向根目錄下的文件uuid bool exists = await file.exists(); return exists; } // 寫(xiě)入數(shù)據(jù) static writeData() async { // 如果文件存在,會(huì)將原來(lái)的內(nèi)容覆蓋, 如果不存在,則創(chuàng)建文件 String uuid = await getUuid(); file.writeAsString('$uuid'); } // 讀取文件 static Future<String> readData() async { try { String uuid = await file.readAsString(); return uuid; } catch (e) { return null; } } // 獲取uuid,采用的插件:uuid static Future<String> getUuid() async { Uuid uuidObj = Uuid(); String uuid = uuidObj.v1(); return uuid; } }
以上就是Android 如何獲取設(shè)備唯一標(biāo)識(shí)的詳細(xì)內(nèi)容,更多關(guān)于Android 獲取設(shè)備唯一標(biāo)識(shí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)TextView中文字鏈接的4種方式介紹及代碼
Android實(shí)現(xiàn)TextView中文字鏈接的方式有很多種;總結(jié)起來(lái)大概有4種:用Spannable或?qū)崿F(xiàn)它的類,如SpannableString來(lái)格式,部分字符串等等,感興趣的你可以參考下2013-02-02Android數(shù)據(jù)持久化之讀寫(xiě)SD卡中內(nèi)容的方法詳解
這篇文章主要介紹了Android數(shù)據(jù)持久化之讀寫(xiě)SD卡中內(nèi)容的方法,結(jié)合具體實(shí)例形式分析了Android持久化操作中針對(duì)SD卡進(jìn)行讀寫(xiě)操作的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-05-05Flutter 使用fluro的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)進(jìn)行頁(yè)面切換
在實(shí)際應(yīng)用中,我們常常會(huì)對(duì)不同的頁(yè)面采取不同的轉(zhuǎn)場(chǎng)動(dòng)畫(huà),以提高頁(yè)面切換過(guò)程中的用戶體驗(yàn)。例如,微信的掃碼后在手機(jī)上確認(rèn)登錄頁(yè)面就是從底部彈出的,而大部分頁(yè)面的跳轉(zhuǎn)都是從右向左滑入。通過(guò)這種形式區(qū)分不同的轉(zhuǎn)場(chǎng)場(chǎng)景,從而給用戶更多的趣味性以提高用戶體驗(yàn)。2021-06-06Android開(kāi)發(fā)實(shí)現(xiàn)仿京東商品搜索選項(xiàng)卡彈窗功能
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)仿京東商品搜索選項(xiàng)卡彈窗功能,涉及Android布局及事件響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android開(kāi)發(fā)獲取手機(jī)Mac地址適配所有Android版本
這篇文章主要介紹了Android開(kāi)發(fā)獲取手機(jī)Mac地址適配所有Android版本,需要的朋友可以參考下2020-03-03Android進(jìn)度條ProgressBar的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android進(jìn)度條ProgressBar的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Android顏色處理SweepGradient掃描及梯度渲染示例
這篇文章主要為大家介紹了Android顏色處理SweepGradient掃描渲染及梯度渲染示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android Studio新建工程默認(rèn)在build.gradle中加入maven阿里源的問(wèn)題
這篇文章主要介紹了Android Studio新建工程默認(rèn)在build.gradle中加入maven阿里源的問(wèn)題,本文通過(guò)實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Android PC端用ADB抓取指定應(yīng)用日志實(shí)現(xiàn)步驟
這篇文章主要介紹了Android PC端用ADB抓取指定應(yīng)用日志實(shí)現(xiàn)步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04