Android Q适配之IMEI替换为Android_id

前置工作:

项目配置升到对应的29版本

compileSdkVersion: 29,
buildToolsVersion: ‘29.0.0',
minSdkVersion : 19,
targetSdkVersion : 29,
javaVersion : JavaVersion.VERSION_1_8

升级到Android Q后的权限提示界面

老版本获取IMEI的方法:

public static String getIMEI(Context context) {
    String deviceId = null;
    try {
      TelephonyManager tm = (TelephonyManager) context
          .getSystemService(Context.TELEPHONY_SERVICE);
      deviceId = tm.getDeviceId();
      if (deviceId == null || "".equals(deviceId)) {
        return getLocalMacAddress(context);
      }
    } catch (Exception e) {
      e.printStackTrace();
      if (deviceId == null || "".equals(deviceId)) {
        return getLocalMacAddress(context);//获取Mac地址,在Android 9 P版本中,地址会随机变化,不可用作唯一标识,可去掉。
      }
    }

    return deviceId;
  }

Android Q获取IMEI方法

public static String getIMEI(Context context) {
    String deviceId = null;
    try {
      TelephonyManager tm = (TelephonyManager) context
          .getSystemService(Context.TELEPHONY_SERVICE);
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        deviceId = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
      } else {
        // request old storage permission
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
          // TODO: Consider calling
          //  ActivityCompat#requestPermissions
          // here to request the missing permissions, and then overriding
          //  public void onRequestPermissionsResult(int requestCode, String[] permissions,
          //                     int[] grantResults)
          // to handle the case where the user grants the permission. See the documentation
          // for ActivityCompat#requestPermissions for more details.
          return null;
        }
        deviceId = tm.getDeviceId();
      }
      if (deviceId == null || "".equals(deviceId)) {
        return getLocalMacAddress(context);
      }
    } catch (Exception e) {
      e.printStackTrace();
      if (deviceId == null || "".equals(deviceId)) {
        return getLocalMacAddress(context);
      }
    }

    return deviceId;
  }

谷歌官方有声明:手机恢复出厂设置,Android ID会重置。

如果用户拒绝权限,也还是会获取不到设备标识。

所以具体优化需自行结合开发情景,有更好的建议的道友可以评论补充说明^ - ^…

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android如何获取双卡手机IMEI的方法示例

    前言: 项目中有个统计付费广告转化率的需求,需要获取用户手机的IMEI.但是网上最常见的方法有坑,也就是TelephonyManager.getDeviceId(),这方法有可能获取的是MEID或者空值.然后自己Google了下,发现搜出来的靠前的几个答案都不能正确获取到两个IMEI值.然后看到TelephonyManager源码中getDeviceId()方法的下一个方法就是getImei()方法,只不过被系统隐藏掉了.运用反射调用一下,的确能获取两个IMEI值,故在此分享一下~~ 背景: 一

  • Android中获取IMEI码的方法

    核心代码:Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId();1.加入权限在manifest.xml文件中要添加 <uses-permission android:name="android.permission.READ_PHONE_STATE" />2.代码 复制代码 代码如下: package net.sunniwell.app;     import androi

  • Android Q适配之IMEI替换为Android_id

    前置工作: 项目配置升到对应的29版本 compileSdkVersion: 29, buildToolsVersion: '29.0.0', minSdkVersion : 19, targetSdkVersion : 29, javaVersion : JavaVersion.VERSION_1_8 升级到Android Q后的权限提示界面 老版本获取IMEI的方法: public static String getIMEI(Context context) { String deviceI

  • Android 10 适配攻略小结

    相比较去年写的Android 9适配,这次Android 10的内容有点多.没想到写了我整整两天,吐血中... 准备工作 老规矩,首先将我们项目中的 targetSdkVersion 改为 29. 1.Scoped Storage(分区存储) 说明 在Android 10之前的版本上,我们在做文件的操作时都会申请存储空间的读写权限.但是这些权限完全被滥用,造成的问题就是手机的存储空间中充斥着大量不明作用的文件,并且应用卸载后它也没有删除掉.为了解决这个问题,Android 10 中引入了 Sco

  • Android string.xml中的替换方法

    本文实例讲述了Android string.xml中的替换方法.分享给大家供大家参考,具体如下: 在android的开发中,经常会遇见一句话,比如"我今年23岁了":这个23需要在程序中生成,但是遇到一个问题,这完整的一句话是一个TextView中的,而不是三个textView拼接成的,而且是引用的string.xml文件中写好的:使用字符串拼接也可以实现,但是特别麻烦: 今天遇到一个好方法,在string.xml中,不仅可以设置文字的格式换行等,还可以设置类似于变量的文本格式: 1.

  • 详解Android版本适配:9.0 Pie

    一.前言 本文主要是从官方文档中筛选出一些常见的适配项,若有任何纰漏或需要补充的,欢迎大家在评论区指出. 二.版本适配 1. 限制 HTTP 网络请求 Android 9.0 中限制了 HTTP(明文传输)网络请求,若仍继续使用HTTP请求,则会在日志中提示以下异常(只是无法正常发出请求,不会导致应用崩溃): java.net.UnknownServiceException: CLEARTEXT communication to xxx not permitted by network secu

  • Android屏幕适配工具类 Android自动生成不同分辨率的值

    本文实例为大家分享了Android屏幕适配工具类的具体代码,供大家参考,具体内容如下 DimenTool github地址 Android 屏幕适配方案,自动生成不同分辨率的值 android中官方建议的屏幕适配方式,通过根据不同的分辨率在工程的res文件夹下建立不同的尺寸文件夹,每个文件夹下都建立dimens.xml文件.然后根据不同的尺寸在dimens.xml文件夹中分别计算配置不同的dp或者sp单位.开发中发现,android屏幕适配需要用到很多的尺寸,每个尺寸都建立dimens.xml问

  • Android 应用适配 Android 7.0 权限要求详解

    对于 Android 6.0 以下 , 对于 Android 应用的权限要求是在安装应用的时候默认直接获取:但是对于 Android 6.0 以及以上,对于应用权限的获取具有更高的要求.应用只有获取到了相关权限才可以正常运行,相反如果用户没有赋予相关权限则应用直接退出甚至崩溃,无法进行正常的运行. 具体可以参考下列获取手机定位,手机读写存储和手机状态权限的事例代码: public class AppMainActivity extends AppCompatActivity { @Overrid

  • Android Q之气泡弹窗的实现示例

    在Android Q中,用户可以借助气泡,轻松地在设备上任何位置进行多任务处理.气泡内置于"通知"系统中,它会浮动在其他应用的上层,并会跟随用户的移动而移动到屏幕的任何位置,用于取代SYSTEM_ALERT_WINDOW.气泡可以展开显示应用功能和信息,并在不使用时折叠起来.当设备处于已锁定状态或始终保持活动状态,气泡会像通知那样显示.气泡弹窗效果如下图: 一.气泡配置信息  气泡是一种可以选择停用的功能,在应用显示第一个气泡时,系统会弹出权限对话框,提供两种选项: 屏蔽来自您的应用的

  • android 分辨率适配的方法

    以前在公司做项目的时候,遇到了分辨率的适配问题,说起来当时挺纠结的,因为没有外网,所以这个问题,都是黑暗中摸索的,尝试了许多方法,最后和徒弟们一起搞出了这个方法,具体行不行,先和大家分享下,这个方法不能说万能的,但是最起码它解决了分辨率跟密集度的关系,但是也引来一个问题,就是布局会因为图片资源小而失真,所以这也需要美工的同志多多配合的,废话不说,贴代码: 第一步,先创建一个view信息的javabean类: 复制代码 代码如下: package com.zte.layout.adapter; i

  • 详解Android MacAddress 适配心得

    android 6.0以下mac地址获取 我们获取mac地址一般都是这样写的: /** * 根据wifi信息获取本地mac * @param context * @return */ public static String getLocalMacAddressFromWifiInfo(Context context){ WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInf

  • Android 监听apk安装替换卸载广播的实现代码

    首先是要获取应用的安装状态,通过广播的形式以下是和应用程序相关的Broadcast ActionACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包名ACTION_PACKAGE_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正

随机推荐