【问题标题】:Kotlin : TelephonyManager.getImei() Call requires permission which may be rejected by userKotlin:TelephonyManager.getImei() 调用需要权限,可能会被用户拒绝
【发布时间】:2019-05-16 11:44:48
【问题描述】:

我正在使用 Kotlin 开发一个 android 应用程序,我使用 api 28。 我想获取 deviceId 编号。一开始我使用 TelephonyManager.deviceId,经过一些研究,我发现它已被弃用。
我找到了解决方案,将 deviceId 替换为 getImei() 以下是我的代码的摘录:

 val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        if (telephonyManager != null) {

            val androidID = Settings.Secure.getString(this.contentResolver, Settings.Secure.ANDROID_ID)
            if (androidID != null) {
                Utility().DEVICE_ID = androidID
                Utility().setDataBykeyValue(applicationContext, AppController.SHAIRD_PREF_DEVICE_ID, androidID)
            } else {
                val devId = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) telephonyManager.getImei()
                 else telephonyManager.getDeviceId()
                Utility().DEVICE_ID  = devId
                Utility().setDataBykeyValue(applicationContext, AppController.SHAIRD_PREF_DEVICE_ID, devId)
            }
            Utility().CARRIER = telephonyManager.simOperatorName

        }

我也将此权限添加到我的 AndroidManifest.xml 中:

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

“telephonyManager.getImei()”下划线有红线,并出现以下消息:

调用需要权限,可能会被用户拒绝:代码应该 明确检查权限是否可用(使用 checkPermission) 或显式处理潜在的

我想知道是什么问题以及如何纠正它

【问题讨论】:

  • 在调用方法前检查是否有权限。
  • 如何查看?
  • 您必须实现运行时权限。仅仅在清单中声明是不够的
  • 检查this guide 了解如何正确请求权限并处理答案。

标签: android kotlin telephonymanager


【解决方案1】:

对于 Java:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
     requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
   } else {
       // else for if they have already given permission
   }
}

您也可以查看本教程:https://www.androidhive.info/2016/11/android-working-marshmallow-m-runtime-permissions/

对于 Kotlin:

 val permission = ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_PHONE_STATE)

 if (permission != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), 1)
  }

您也可以查看本教程:https://www.techotopia.com/index.php/Kotlin_-_Making_Runtime_Permission_Requests_in_Android

【讨论】:

    【解决方案2】:
     public static String getImei(TelephonyManager tm) {
            String imei;
            try{
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    imei = tm.getDeviceId(0);
                }else{
                    imei = tm.getDeviceId();
                }
            }catch(SecurityException e){
                imei = "";
            }
            return imei;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多