【问题标题】:PhoneNumberUtils.formatNumber NullPointExceptionPhoneNumberUtils.formatNumber NullPointErexception
【发布时间】:2021-05-11 18:01:29
【问题描述】:
package com.example.helloworld;
    
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

import java.util.Locale;

public class IncomingCallBroadcastReceiver extends BroadcastReceiver {

    public static final String TAG = "PHONE STATE";
    private static String mLastState;
    private final Handler mHandler = new Handler(Looper.getMainLooper());

    @Override
    public void onReceive(final Context context, Intent intent) {
        Log.d(TAG,"onReceive()");

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (state.equals(mLastState)) {
            return;
        } else {
            mLastState = state;
        }

        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

if (incomingNumber == null ) {
                Log.i("call-state", " : NULL");
            } else {
                if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) {
                    Toast.makeText(context, "call Active", Toast.LENGTH_SHORT).show();
                } else if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
                    Toast.makeText(context, "No call", Toast.LENGTH_SHORT).show();
                } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
                    Toast.makeText(context, "Ringing State", Toast.LENGTH_SHORT).show();
                    Toast.makeText(context, incomingNumber, Toast.LENGTH_SHORT).show();
                }
            }

            final String phone_number;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                phone_number = PhoneNumberUtils.formatNumber(incomingNumber, Locale.getDefault().getCountry());
            } else {
                phone_number = PhoneNumberUtils.formatNumber(incomingNumber);
            }
            Intent serviceIntent = new Intent(context, CallingService.class);
            serviceIntent.putExtra(CallingService.EXTRA_CALL_NUMBER, phone_number);
            context.startService(serviceIntent);
        }
    }
}

我检查并尝试了所有 stackoverflow 问题和答案。 但是,程序会在以下位置引发异常:

phone_number = PhoneNumberUtils.formatNumber(incomingNumber, Locale.getDefault().getCountry());

这是个例外:

java.lang.RuntimeException: 无法启动接收器 com.example.helloworld.IncomingCallBroadcastReceiver: java.lang.NullPointerException:尝试调用虚拟方法 'boolean java.lang.String.startsWith(java.lang.String)' 为空 对象引用

因此,我猜以下是返回 null:

String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

我尝试了许多其他方法,例如添加READ_CALL_LOG。但它没有用。 连吐司消息都没有显示。 有什么办法解决吗?

【问题讨论】:

  • 别猜了,看看什么是空的。例如使用调试器或通过记录一些值。找出问题所在是解决问题的第一步。
  • 显而易见的问题是:您使用的是什么 API/权限/设备?由于 API 29 不推荐使用 telephonyManager
  • @ibecar 我正在使用 API 28
  • @Henry 我检查了它,它返回 null!

标签: java android-studio nullpointerexception telephonymanager


【解决方案1】:

这是 API 的预期行为,according to the docs 在两种情况下,EXTRA_INCOMING_NUMBER 会为空:

  1. 如果您的应用程序没有READ_CALL_LOG 权限,您已经说过您的应用程序中有,但是请注意,将其添加到您的清单是不够的,您需要实现runtime permissions 才能真正接收它.
  2. 如果当前状态更改不是EXTRA_STATE_IDLE => EXTRA_STATE_RINGINGEXTRA_STATE_IDLE => EXTRA_STATE_OFFHOOK。我只看到你在获取额外的状态之前检查新状态的值并忽略以前的状态。

我可以添加我知道的另一件事,当您的应用程序具有 READ_CALL_LOG 权限时,您将为每个事件获得两个广播,一个 EXTRA_INCOMING_NUMBER 始终为空,另一个相同的状态更改 @987654331 @ 可能会有一个值(根据上述情况),因此不要忽略重复的状态更改 (if (state.equals(mLastState)) return),只有在 EXTRA_INCOMING_NUMBER 的值为 null 时才应该跳过它。

这是文档中的相关 sn-p:

此额外内容仅适用于 ACTION_PHONE_STATE_CHANGED 广播已被授予 Manifest.permission.READ_CALL_LOG 和 Manifest.permission.READ_PHONE_STATE 权限。

对于来电,电话号码只保证 当 EXTRA_STATE 从 EXTRA_STATE_IDLE 更改为 EXTRA_STATE_RINGING。如果来电者来自未知号码, 额外的将填充一个空字符串。对于拨出电话, 电话号码只有在 EXTRA_STATE 从 EXTRA_STATE_IDLE 变为 EXTRA_STATE_OFFHOOK。

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 2015-06-10
    • 2015-01-30
    • 2021-04-24
    • 2013-10-28
    • 2012-05-26
    • 2014-04-28
    • 2015-02-28
    相关资源
    最近更新 更多