国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Android 如何獲取設(shè)備唯一標(biāo)識

瀏覽:3日期:2022-09-20 09:40:46
一. 先簡單總結(jié)一下比較常見的幾個解決方案的弊端:1. IMEI

Android 10 中官方明確說明第三方應(yīng)用無法獲取到IMEI碼:Android 10 中的隱私權(quán)變更,

Android 10 以下的版本,需要申請READ_PHONE_STATE權(quán)限。

2. Android ID

Android ID 不具有真正的唯一性,

ROOT、刷機(jī)、恢復(fù)出廠設(shè)置、不同簽名的應(yīng)用等都會導(dǎo)致獲取的 Android ID 發(fā)生改變,

并且不同廠商定制的系統(tǒng)的BUG會導(dǎo)致不同的設(shè)備可能會產(chǎn)生相同的 Android ID。

3. MAC地址

Android 10 中 MAC地址具有隨機(jī)化的特征:Android 10 中的隱私權(quán)變更—MAC地址,

雖然目前大部分手機(jī)還不支持這個特性,但是隨著廠商的跟進(jìn),這個方案就會逐漸作廢

在上面這些設(shè)備自帶的標(biāo)識不夠滿足需求時,我們就要采用另外的方法了。

二. uuid + 本地文件,實(shí)現(xiàn)一個通用解決方案1. 思路

啟動APP時,檢查并讀取根目錄下保存有uuid的文件,若沒有該文件,則視為一臺新設(shè)備,創(chuàng)建文件并寫入uuid。

并且要確保卸載應(yīng)用時,該文件不會被系統(tǒng)攜帶著刪除(這也是為什么要在根目錄下創(chuàng)建的原因)。

2. 解決手機(jī)訪問SDK權(quá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ǔ)上申請動態(tài)權(quán)限。

Android 10 及其以上,文件存儲機(jī)制修改成了沙盒模式,即應(yīng)用只能訪問自己沙盒下的文件和公共媒體文件。

“得益”于沙盒機(jī)制,應(yīng)用創(chuàng)建的文件屬于自己的沙盒,那么當(dāng)應(yīng)用卸載時,也會隨之刪除。

目前可以添加以下一行代碼解決沙盒問題:

<application ... android:requestLegacyExternalStorage='true'>

這樣我們就能在“根目錄”創(chuàng)建自己文件了。

3. 適配 Android 11

Android 11 會強(qiáng)制執(zhí)行沙盒模式,在這之前存儲權(quán)限可以簡單的分為“禁止”和“允許”,在這之后存儲權(quán)限可以簡單的分為“禁止”、“允許訪問媒體文件”和“允許訪問所有文件”。

“允許訪問媒體文件”這是絕大多數(shù)應(yīng)用能夠申請到的,而“允許訪問所有文件”只有文件管理類應(yīng)用可以申請到。假如你不是該類應(yīng)用但又申請了該權(quán)限,那么就會通不過Google Play的審核。

允許訪問所有文件:android.permission.MANAGE_EXTERNAL_STORAGE

介紹到這兒,其實(shí)一個方案已經(jīng)出來了:直接申請“允許訪問所有文件”權(quán)限,后果就是不能通過Google Play的審核。

另外還有一個辦法:我們暫時不升級SDK,針對 Android 10 (SDK 29)來開發(fā)應(yīng)用,這樣的話由于“向后兼容機(jī)制”,我們的應(yīng)用是能夠正常跑在 Android 11 系統(tǒng)上的。

4. Flutter 代碼實(shí)踐

import ’dart:io’;import ’package:uuid/uuid.dart’;// 本地持久化存儲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; } // 寫入數(shù)據(jù) static writeData() async { // 如果文件存在,會將原來的內(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)識的詳細(xì)內(nèi)容,更多關(guān)于Android 獲取設(shè)備唯一標(biāo)識的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 日本欧美色 | 国内自拍视频一区二区三区 | 国产一区二区中文字幕 | 久草观看视频 | 日韩不卡毛片 | 在线a视频网站 | 国产精品爱久久久久久久 | 国外成人在线视频 | 亚州免费一级毛片 | 久久精品成人免费看 | 免费看日韩欧美一级毛片 | 国产成人精品免费视 | 成人在线免费视频 | 成人网18免费网站 | 久久大胆视频 | 久久综合一区二区三区 | 日韩美女在线看免费观看 | 亚洲一区二区三区不卡在线播放 | 99精品免费在线 | 高清在线一区二区三区亚洲综合 | 亚洲精品高清国产麻豆专区 | 亚洲小视频在线观看 | 国产一级特黄一级毛片 | 好爽~好硬~好紧~蜜芽 | 久久香蕉国产线看观看式 | 大量愉拍情侣在线视频 | jizzjizz成熟丰满舒服 | 欧美人与z0z0xxxx | 欧美性另类69xxxx极品 | 国产欧美日本亚洲精品五区 | 好叼操这里只有精品 | 亚洲色视频在线播放网站 | 日韩免费黄色片 | 99re热视频 | 996久久国产精品线观看 | 一级毛片韩国 | 亚洲精品国产第一区二区多人 | 91在线永久 | 亚洲一级毛片中文字幕 | 欧美日韩综合精品一区二区三区 | 日韩精品视频在线 |