Caused by: java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10305 nor current pro

文章讲述了在Android应用中遇到的SecurityException,由于缺少READ_PHONE_STATE、READ_SMS和READ_PHONE_NUMBERS权限,开发者如何通过修改AndroidManifest.xml和Java代码来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

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

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值