问题
Caused by: java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10305 nor current process has android.permission.READ_PHONE_STATE, android.permission.READ_SMS, or android.permission.READ_PHONE_NUMBERS
详细问题
AndroidManifest.xml配置
<manifest>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
</manifest>
笔者核心Java代码
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_PHONE_STATE_PERMISSION = 1001;
private TextView phoneNumberTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
phoneNumberTextView = findViewById(R.id.phoneNumberTextView);
// Check for permission to access phone state
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
// Permission not granted, request it
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},
REQUEST_PHONE_STATE_PERMISSION);
} else {
// Permission granted, proceed to get phone number
getPhoneNumber();
}
}
// Handle permission request result
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PHONE_STATE_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted, proceed to get phone number
getPhoneNumber();
} else {
// Permission denied, handle accordingly (e.g., show a message to the user)
}
}
}
// Method to get phone number
private void getPhoneNumber() {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if (telephonyManager != null) {
String phoneNumber = telephonyManager.getLine1Number();
if (phoneNumber != null && !phoneNumber.isEmpty()) {
phoneNumberTextView.setText("Phone Number: " + phoneNumber);
} else {
phoneNumberTextView.setText("Phone Number not available");
}
}
}
}
控制台具体报错
2024-02-17 16:01:09.029 20023-20023/com.example.assistingagriculture E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.assistingagriculture, PID: 20023
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.assistingagriculture/com.example.assistingagriculture.activity.normal_mode.LoginHomeActivity}: java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10305 nor current process has android.permission.READ_PHONE_STATE, android.permission.READ_SMS, or android.permission.READ_PHONE_NUMBERS
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4765)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4983)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:123)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3059)
at android.os.Handler.dispatchMessage(Handler.java:117)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:293)
at android.app.ActivityThread.loopProcess(ActivityThread.java:9934)
at android.app.ActivityThread.main(ActivityThread.java:9923)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240)
Caused by: java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10305 nor current process has android.permission.READ_PHONE_STATE, android.permission.READ_SMS, or android.permission.READ_PHONE_NUMBERS
at android.os.Parcel.createExceptionOrNull(Parcel.java:2443)
at android.os.Parcel.createException(Parcel.java:2427)
at android.os.Parcel.readException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2352)
at com.android.internal.telephony.ITelephony$Stub$Proxy.getLine1NumberForDisplay(ITelephony.java:11427)
at android.telephony.TelephonyManager.getLine1Number(TelephonyManager.java:4887)
at android.telephony.TelephonyManager.getLine1Number(TelephonyManager.java:4855)
at com.example.assistingagriculture.activity.normal_mode.LoginHomeActivity.getPhoneNumber(LoginHomeActivity.java:69)
at com.example.assistingagriculture.activity.normal_mode.LoginHomeActivity.onCreate(LoginHomeActivity.java:56)
at android.app.Activity.performCreate(Activity.java:8592)
at android.app.Activity.performCreate(Activity.java:8565)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1344)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4733)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4983)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:123)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3059)
at android.os.Handler.dispatchMessage(Handler.java:117)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:293)
at android.app.ActivityThread.loopProcess(ActivityThread.java:9934)
at android.app.ActivityThread.main(ActivityThread.java:9923)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240)
解决方案
步骤1、修改AndroidManifest.xml配置
添加<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
即将:
<manifest>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
</manifest>
修改为
<manifest>
<!-- Grants the READ_PHONE_STATE permission only on devices that run
Android 10 (API level 29) and lower. -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>
步骤2、修改Java代码
1、Ctrl+R(当前文件内容替换)
原始内容 REQUEST_PHONE_STATE_PERMISSION
替换内容 REQUEST_PHONE_NUMBERS_PERMISSION
该步骤非必须,但考虑到变量命名规范,建议进行
2、Ctrl+R(当前文件内容替换)
原始内容 Manifest.permission.READ_PHONE_STATE
替换内容 Manifest.permission.READ_PHONE_NUMBERS
即将上述代码修改为:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_PHONE_NUMBERS_PERMISSION = 1001;
private TextView phoneNumberTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
phoneNumberTextView = findViewById(R.id.phoneNumberTextView);
// Check for permission to access phone state
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS)
!= PackageManager.PERMISSION_GRANTED) {
// Permission not granted, request it
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_NUMBERS},
REQUEST_PHONE_NUMBERS_PERMISSION);
} else {
// Permission granted, proceed to get phone number
getPhoneNumber();
}
}
// Handle permission request result
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PHONE_NUMBERS_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted, proceed to get phone number
getPhoneNumber();
} else {
// Permission denied, handle accordingly (e.g., show a message to the user)
}
}
}
// Method to get phone number
private void getPhoneNumber() {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if (telephonyManager != null) {
String phoneNumber = telephonyManager.getLine1Number();
if (phoneNumber != null && !phoneNumber.isEmpty()) {
phoneNumberTextView.setText("Phone Number: " + phoneNumber);
} else {
phoneNumberTextView.setText("Phone Number not available");
}
}
}
}
产生原因
在运行应用程序时,出现了安全性异常 java.lang.SecurityException。异常信息表明当前进程没有 android.permission.READ_PHONE_STATE、android.permission.READ_SMS 或 android.permission.READ_PHONE_NUMBERS 权限,导致无法执行 getLine1NumberForDisplay 方法。
解决原因
对于java代码:修改 Java 代码,确保正确请求和处理权限
总结
chatgpt代码质量相对较高,但是若是开发者所使用的开发平台最近对于语法规则进行变动,考虑到chatgpt3.5学习库具有一定的滞后性,无法第一时间获取相关信息,所以无法解决相关问题
值得高兴的是,虽然chatgpt3.5学习库具有一定的滞后性,但是openAI团队在一定时间间隔后,会给它喂相对较新的数据。chatgpt3.5诞生之初,chatgpt3.5所提供的学习截至日期是2021年9月,如今(2024年2月17日),chatgpt3.5所提供的学习截至日期是2022年1月。
参考文献
Android 11 中的权限更新
产生原因与解释原因部分 部分内容参考chatgpt
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈