java - TelephonyManager 为所有参数抛出错误。用户 10449 不满足访问设备标识符的要求
问题描述
我是 Android Studio 和电话经理的新手。我开始了一个项目,我需要在其中找到设备详细信息,例如单元信息、单元位置、设备 IMEI、SIM 序列号等。我的目标设备是 Jellybean 和更大。我使用“字符串 ID =tm.getImei();” 对于所有可用参数,并在 android manifest 中提供手机状态权限。构建和安装成功,但应用程序很快就会崩溃。
Java主文件:-
package com.example.celldetails;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.CellInfo;
import android.telephony.CellLocation;
import android.telephony.TelephonyManager;
import android.widget.Switch;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView tv;
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textview1);
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String ID =tm.getImei();
String SIMserialno = tm.getSimSerialNumber();
String netcountry = tm.getNetworkCountryIso();
String simcountry = tm.getSimCountryIso();
if (ActivityCompat.checkSelfPermission(this, 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;
}
String voicemailno = tm.getVoiceMailNumber();
String strphonetype=" ";
String operator=tm.getSimOperatorName();
List<CellInfo> cellinfo=tm.getAllCellInfo();
CellLocation cellinfo2=tm.getCellLocation();
int phonetype=tm.getPhoneType();
switch (phonetype)
{
case (TelephonyManager.PHONE_TYPE_CDMA):
strphonetype="CDMA";
break;
case (TelephonyManager.PHONE_TYPE_GSM):
strphonetype="GSM";
break;
case(TelephonyManager.PHONE_TYPE_NONE) :
strphonetype="None";
break;
}
String strsimstate="";
int simsstate=tm.getSimState();
switch (simsstate)
{
case (TelephonyManager.SIM_STATE_ABSENT):
strphonetype="sim state is missing";
break;
case (TelephonyManager.SIM_STATE_NETWORK_LOCKED):
strsimstate="sim state network is locked";
break;
case (TelephonyManager.SIM_STATE_READY):
strsimstate="sim state is ready";
break;
case (TelephonyManager.SIM_STATE_UNKNOWN):
strsimstate="state is unknown";
break;
}
boolean isroaming=tm.isNetworkRoaming();
String detail="Phone State Detail";
detail=detail+"\n IMEI Number:-"+ID;
detail=detail+"\nSIM Serial Number="+SIMserialno;
detail=detail+"\nNetwork Country ISO="+netcountry;
detail=detail+"\nSIM Country ISO="+simcountry;
detail=detail+"\nVoice Mail Number="+voicemailno;
detail=detail+"\nRoaming="+isroaming;
detail=detail+"\nNetwork Type"+strphonetype;
detail=detail+"\nSim State="+strsimstate;
detail=detail+"\nOperator Name="+operator;
detail=detail+"\nCell Info="+cellinfo;
detail=detail+"\nCell Location"+cellinfo2;
tv.setText(detail);
}
}
Android清单文件:-
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.celldetails">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
tools:ignore="ProtectedPermissions" />
<application
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.CellDetails">
<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>
运行错误:-
08/21 09:29:50:在三星 SM-M515F 上启动“应用程序”。安装成功在 16 秒 516 毫秒内完成。$ adb shell am start -n "com.example.celldetails/com.example.celldetails.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER 连接到设备'samsung-sm_m515f上的进程20160 -RZ8N91E8TPM'。从应用程序捕获和显示 logcat 消息。可以在“调试器”设置页面的“Logcat 输出”部分禁用此行为。D/ActivityThread: handleBindApplication()++ app=com.example.celldetails D/ActivityThread: handleBindApplication() -- skipGraphicsSupport=false ActivityThread::handleMakeApplication() data=AppBindData{appInfo=ApplicationInfo{a47c78a com.example.celldetails}} appContext=android.app.ContextImpl@e1831fb appContext.mOpPackageName=com.example。允许)W/ple.celldetail:访问隐藏方法 Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V(灰名单,反射,允许) D/AndroidRuntime:关闭 VM E/AndroidRuntime:致命异常:主进程:com.example .celldetails, PID: 20160 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.celldetails/com.example.celldetails.MainActivity}: java.lang.SecurityException: getIccSerialNumber: 用户 10449 不符合要求访问设备标识符。在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3792) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android。 app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) 在 android.os.Handler.dispatchMessage(Handler.java:106 ) 在 android.os.Looper.loop(Looper.java:246) 在 android.app.ActivityThread.main(ActivityThread.java:8506) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android。 internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) 原因:java.lang.SecurityException: getIccSerialNumber: The user 10449 does不满足访问设备标识符的要求。在 android.os.Parcel.createExceptionOrNull(Parcel.java:2385) 在 android.os.Parcel.createException(Parcel.java:2369) 在 android.os.Parcel.readException(Parcel.java:2352) 在 android.os。包裹。servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) 在 android.os .Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:246) 在 android.app.ActivityThread.main(ActivityThread.java:8506) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) 的 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 调用(本机方法) I/Process:发送信号。PID:20160 SIG:9 handleMessage(ActivityThread.java:2307) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:246) 在 android.app.ActivityThread.main(ActivityThread.java :8506) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130) I/Process:发送信号。PID:20160 SIG:9 handleMessage(ActivityThread.java:2307) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:246) 在 android.app.ActivityThread.main(ActivityThread.java :8506) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130) I/Process:发送信号。PID:20160 SIG:9 1130) I/Process:发送信号。PID:20160 SIG:9 1130) I/Process:发送信号。PID:20160 SIG:9
解决方案
推荐阅读
- java - OpenAPI/Swagger-UI 注释和@BeanParam
- angular - 如何在 mat-stepper 中显示最后一个 mat-step 已完成?
- android - 通过搜索栏更改流音频的位置后,如何确定音频是否准备好播放?
- sql-server - 我在 Azure SQL Server 中收到此错误“操作系统错误代码 5(访问被拒绝。)”
- java - { "errorType": "java.lang.ExceptionInInitializerError" } 在 AWS Lambda 函数中
- oracle - 如何基于与上方/下方行相关的逻辑创建新列
- r - 如何将刺激随机分配到 4 个治疗组,并确保每个组包含偶数个真/假陈述?
- php - PHP - mysqli_stmt_execute() 总是返回 false
- couchdb - CouchDB 偏移量为 1 但查询返回空
- python - 如何让每个工作人员同步以避免连接到 Celery 上的信号的方法出现竞争条件?