当前位置: 首页 > article >正文

安卓设备获取唯一id解决方案

安卓设备获取唯一id解决方案
最近碰到一个需求,需要拿到安卓设备的唯一识别码,然后用于推送,这个码必须唯一,且不能变动,比如卸载软件,或者清除数据 ,也必须保证设备码不变

效果图:上面的图是第一次运行,打印的值,下面的图是卸载后重新运行打印的值
在这里插入图片描述

step1: 引用依赖

   implementation 'com.github.gzu-liyujiang:Android_CN_OAID:4.2.4'

step2:清单权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.iosdialogdemo">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />

    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <!--ZXING END-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />


    <uses-permission android:name="android.permission.WRITE_SETTINGS" />


    <!--esp touch-->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.CAMERA" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <!--对讲权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />

    <!--检测网络状态权限-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.IosDialogDemo">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

step3: 全局初始化

package com.example.iosdialogdemo;


import android.app.Application;
import android.content.Context;

import com.github.gzuliyujiang.oaid.DeviceIdentifier;


/**
 * 参考源码:https://github.com/gzu-liyujiang/Android_CN_OAID.git
 */

public class MyApplication extends Application{
    public static Context app;

    @Override
    public void onCreate() {
        super.onCreate();
        app=getApplicationContext();

        DeviceIdentifier.register(this);
    }
}

step4: 调用方法,拿到设备码

package com.example.iosdialogdemo;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.github.gzuliyujiang.oaid.DeviceID;
import com.github.gzuliyujiang.oaid.DeviceIdentifier;
import com.github.gzuliyujiang.oaid.IGetter;

public class MainActivity extends Activity {

    private MainActivity selfActivity = MainActivity.this;

    private HintDialog hintDialog = new HintDialog(); // 提示框
    private HintDialog singleHintDialog = new HintDialog(); // 单个提示框
    private PhotoDialog photoDialog = new PhotoDialog(); // 拍照 选择相册

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取IMEI,只支持Android 10之前的系统,需要READ_PHONE_STATE权限,可能为空
        String a = DeviceIdentifier.getIMEI(this);
        Log.e("TAG", "获取IMEI:" + a);


        // 获取安卓ID,可能为空
        String b = DeviceIdentifier.getAndroidID(this);
        Log.e("TAG", "获取AndroidID:" + b);


        // 获取数字版权管理ID,可能为空。很鸡肋,在某些手机上还可能造成卡死或闪退,自4.2.7版本后已弃用
        String c = DeviceIdentifier.getWidevineID();
        Log.e("TAG", "获取WidevineID:" + c);


        // 获取伪造ID,根据硬件信息生成,不会为空,有大概率会重复
        String d = DeviceIdentifier.getPseudoID();
        Log.e("TAG", "获取PseudoID:" + d);


        // 获取GUID,随机生成,不会为空
        String e = DeviceIdentifier.getGUID(this);
        Log.e("TAG", "获取GUID:" + e);


        // 是否支持OAID/AAID
        boolean f = DeviceID.supportedOAID(this);
        Log.e("TAG", "是否支持OAID/AAID:" + f);


        // 获取OAID/AAID,同步调用
        String g = DeviceIdentifier.getOAID(this);
        Log.e("TAG", "OAID/AAID:" + g);


        // 获取OAID/AAID,异步回调
        DeviceID.getOAID(this, new IGetter() {
            @Override
            public void onOAIDGetComplete(String result) {
                // 不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一
                Log.e("TAG", "onOAIDGetComplete:" + result);
            }

            @Override
            public void onOAIDGetError(Exception error) {
                // 获取OAID/AAID失败
            }
        });

    }
}

end


http://www.kler.cn/news/366460.html

相关文章:

  • 力扣283-- 移动零
  • duilib的应用 在双屏异分辨率的显示器上 运行显示不出来
  • 海外云手机怎样助力亚马逊店铺运营?
  • 打包方式-jar和war的区别
  • K最近邻算法
  • H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)
  • rust:特征特征对象对象安全
  • 【JAVA毕业设计】基于Vue和SpringBoot的校园管理系统
  • Elasticsearch安装使用
  • Java线程死锁与活锁
  • Vue Router 如何配置 404 页面?
  • 解释 RESTful API,以及如何使用它构建 web 应用程序(AI)
  • 京准电钟:NTP网络校时服务器应用计算机大数据
  • 机器学习快速入门之手写体数字识别
  • springboot2.0x 和springboot 1.0 整合redis 使用自定义CacheManager 问题
  • Spring MVC(上)
  • 【Golang】goconvey测试框架的使用
  • 【thinkphp8】00005 thinkphp8 Db::table和Db::name的区别
  • H264的POC能是负数吗?关于IntraDelay带来的先来P帧,再来IDR的效果
  • 传输层TCP协议
  • ubuntu新装ubuntu,重启黑屏
  • docker search 命令基本使用
  • Java使用dom4j生成kml(xml)文件遇到No such namespace prefix: xxx is in scope on:问题解决
  • leetcode:写出排序的过程,给出2个有序的子序列,如何将已有序的子序列合并,得到完全有序的序列,复杂度越低越好
  • Muggle OCR 是一个高效的本地OCR(光学字符识别)模块
  • 基于单片机的搬运机器人控制系统