Android如何获取设备唯⼀标识
⽬录
⼀. 先简单总结⼀下⽐较常见的⼏个解决⽅案的弊端:
1. IMEI
2. Android ID
3. MAC地址
⼆. uuid + 本地⽂件,实现⼀个通⽤解决⽅案
1. 思路
2. 解决⼿机访问SDK权限问题
3. 适配 Android 11
4. Flutter 代码实践
⼀. 先简单总结⼀下⽐较常见的⼏个解决⽅案的弊端:
1. IMEI
Android 10 中官⽅明确说明第三⽅应⽤⽆法获取到IMEI码:,
Android 10 以下的版本,需要申请READ_PHONE_STATE权限。
2. Android ID
Android ID 不具有真正的唯⼀性,
ROOT、刷机、恢复出⼚设置、不同签名的应⽤等都会导致获取的 Android ID 发⽣改变,
并且不同⼚商定制的系统的BUG会导致不同的设备可能会产⽣相同的 Android ID。
3. MAC地址
Android 10 中 MAC地址具有随机化的特征:,
虽然⽬前⼤部分⼿机还不⽀持这个特性,但是随着⼚商的跟进,这个⽅案就会逐渐作废
在上⾯这些设备⾃带的标识不够满⾜需求时,我们就要采⽤另外的⽅法了。
⼆. uuid + 本地⽂件,实现⼀个通⽤解决⽅案
1. 思路
启动APP时,检查并读取根⽬录下保存有uuid的⽂件,若没有该⽂件,则视为⼀台新设备,创建⽂件并写⼊uuid。并且要确保卸载应⽤时,该⽂件不会被系统携带着删除(这也是为什么要在根⽬录下创建的原因)。
2. 解决⼿机访问SDK权限问题
Android 6 以下,添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Android 6 及其以上,则需要在此基础上申请动态权限。
Android 10 及其以上,⽂件存储机制修改成了沙盒模式,即应⽤只能访问⾃⼰沙盒下的⽂件和公共媒
体⽂件。“得益”于沙盒机制,应⽤创建的⽂件属于⾃⼰的沙盒,那么当应⽤卸载时,也会随之删除。
⽬前可以添加以下⼀⾏代码解决沙盒问题:
<application
...
android获取真正的签名android:requestLegacyExternalStorage="true">
这样我们就能在“根⽬录”创建⾃⼰⽂件了。
3. 适配 Android 11
Android 11 会强制执⾏沙盒模式,在这之前存储权限可以简单的分为“禁⽌”和“允许”,在这之后存储权限可以简单的分为“禁⽌”、“允许访问媒体⽂件”和“允许访问所有⽂件”。
“允许访问媒体⽂件”这是绝⼤多数应⽤能够申请到的,⽽“允许访问所有⽂件”只有⽂件管理类应⽤可以申请到。假如你不是该类应⽤但⼜申请了该权限,那么就会通不过Google Play的审核。
允许访问所有⽂件:android.permission.MANAGE_EXTERNAL_STORAGE
介绍到这⼉,其实⼀个⽅案已经出来了:直接申请“允许访问所有⽂件”权限,后果就是不能通过Google Play的审核。
另外还有⼀个办法:我们暂时不升级SDK,针对 Android 10 (SDK 29)来开发应⽤,这样的话由于“向后兼容机制”,我们的应⽤是能够正常跑在 Android 11 系统上的。
4. Flutter 代码实践
import 'dart:io';
import 'package:uuid/uuid.dart';
// 本地持久化存储uuid代码实践
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;
}
}
// 创建⽂件
static Future<bool> createFile() async {
file = File('/storage/emulated/0/uuid.ini'); // 指向根⽬录下的⽂件uuid
bool exists = ists();
return exists;
}
// 写⼊数据
static writeData() async {
// 如果⽂件存在,会将原来的内容覆盖, 如果不存在,则创建⽂件
String uuid = await getUuid();
file.writeAsString('$uuid');
}
/
/ 读取⽂件
static Future<String> readData() async {
try {
String uuid = adAsString();
return uuid;
} catch (e) {
return null;
}
}
// 获取uuid,采⽤的插件:uuid
static Future<String> getUuid() async {
Uuid uuidObj = Uuid();
String uuid = uuidObj.v1();
return uuid;
}
}
以上就是Android 如何获取设备唯⼀标识的详细内容,更多关于Android 获取设备唯⼀标识的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论