Android 6.0获取IMEI号是出错,动态获取权限

    之前更新了一个版本,获取用户的IMEI设备号,本地手机测试没问题,就放到服务器上,结果有很多用户反应,应用打不开。也不是全部用户,只有少部分Android 6.0系统的用户和一些root过的用户,由于那不到用户手机,只能从错误日志中查看。

出错日志:

SUPPORTED_64_BIT_ABIS=[Ljava.lang.String;@cdce4d6
versionCode=42
BOARD=MSM8974
BOOTLOADER=unknown
TYPE=user
ID=MMB29M
TIME=1458153356000
BRAND=Xiaomi
TAG=Build
SERIAL=953692f1
HARDWARE=qcom
SUPPORTED_ABIS=[Ljava.lang.String;@b4ad357
CPU_ABI=armeabi-v7a
RADIO=unknown
IS_DEBUGGABLE=true
MANUFACTURER=Xiaomi
SUPPORTED_32_BIT_ABIS=[Ljava.lang.String;@85460f1
TAGS=release-keys
CPU_ABI2=armeabi
UNKNOWN=unknown
USER=builder
FINGERPRINT=Xiaomi/cancro_wc_lte/cancro:6.0.1/MMB29M/6.3.17:user/release-keys
HOST=qh-miui-ota-bd55
PRODUCT=cancro_wc_lte
versionName=2.5.0
DISPLAY=MMB29M
MODEL=MI 4LTE
DEVICE=cancro
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jshon.perdate/com.jshon.perdate.activity.SplashActivity}: java.lang.SecurityException: getDeviceId: Neither user 10147 nor current process has android.permission.READ_PHONE_STATE.
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2421)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
	at android.app.ActivityThread.access$900(ActivityThread.java:153)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loop(Looper.java:148)
	at android.app.ActivityThread.main(ActivityThread.java:5432)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:735)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
Caused by: java.lang.SecurityException: getDeviceId: Neither user 10147 nor current process has android.permission.READ_PHONE_STATE.
	at android.os.Parcel.readException(Parcel.java:1620)
	at android.os.Parcel.readException(Parcel.java:1573)
	at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:4549)
	at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:711)
	at com.jshon.perdate.activity.SplashActivity.onCreate(SplashActivity.java:179)
	at android.app.Activity.performCreate(Activity.java:6303)
	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2374)
	... 9 more
java.lang.SecurityException: getDeviceId: Neither user 10147 nor current process has android.permission.READ_PHONE_STATE.
	at android.os.Parcel.readException(Parcel.java:1620)
	at android.os.Parcel.readException(Parcel.java:1573)
	at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:4549)
	at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:711)
	at com.jshon.perdate.activity.SplashActivity.onCreate(SplashActivity.java:179)
	at android.app.Activity.performCreate(Activity.java:6303)
	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2374)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
	at android.app.ActivityThread.access$900(ActivityThread.java:153)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loop(Looper.java:148)
	at android.app.ActivityThread.main(ActivityThread.java:5432)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:735)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)

可以看到,是在getDeviceId的时候出错:java.lang.SecurityException: getDeviceId: Neither user 10147 nor current process has android.permission.READ_PHONE_STATE.
网上说没有加权限,但是我在AndroidManifast.xml中确实是设置了权限: < uses-permission  android :name= "android.permission.READ_PHONE_STATE"  />。但是并没有起作用。只能动态获取了:
首先在AndroidManifest.xml中添加权限<uses-permission android:name="android.permission.READ_PHONE_STATE" />
然后在代码中添加:
//Android6.0需要动态获取权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
//            toast("需要动态获取权限");
            ActivityCompat.requestPermissions(SplashActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_PHONE_STATE);
        }else{
//            toast("不需要动态获取权限");
            TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
            Contants.IMEI = TelephonyMgr.getDeviceId();
        }
/**
 *加个获取权限的监听
 */
 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
        if (requestCode == REQUEST_PHONE_STATE && grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
            Contants.IMEI = TelephonyMgr.getDeviceId();
        }
    }




  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值