首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhoneNumberUtils.formatNumber NullPointException

PhoneNumberUtils.formatNumber NullPointException
EN

Stack Overflow用户
提问于 2021-02-08 05:41:50
回答 1查看 399关注 0票数 0
代码语言:javascript
复制
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);
        }
    }
}

我检查并尝试了所有堆叠溢出的问题和答案。但是,该程序在以下位置引发异常:

代码语言:javascript
复制
phone_number = PhoneNumberUtils.formatNumber(incomingNumber, Locale.getDefault().getCountry());

这是一个例外:

com.example.helloworld.IncomingCallBroadcastReceiver::无法启动接收方java.lang.RuntimeException java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法的布尔java.lang.String.startsWith(java.lang.String)‘

因此,我猜以下内容将返回null:

代码语言:javascript
复制
String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

我尝试了许多其他事情,比如添加READ_CALL_LOG。但没起作用。连祝酒词都没显示出来。有办法解决吗?

EN

回答 1

Stack Overflow用户

发布于 2021-02-09 08:41:12

这是API的预期行为,根据医生的说法有两种情况,您将在EXTRA_INCOMING_NUMBER中获得null

  1. 如果您的应用程序没有READ_CALL_LOG权限,您已经在应用程序中说过了,但是请注意,仅将其添加到清单中是不够的,您需要实现运行时权限才能实际接收它。
  2. 如果当前状态更改不是EXTRA_STATE_IDLE、=>、EXTRA_STATE_RINGINGEXTRA_STATE_IDLE => EXTRA_STATE_OFFHOOK,则为。我只看到您正在检查新状态的值,然后才会得到额外的值,而忽略以前的状态。

我可以添加另一件我知道的事情,当您的应用程序拥有READ_CALL_LOG权限时,您将得到每个事件的两个广播,一个是EXTRA_INCOMING_NUMBER总是为空的,另一个是相同的状态--更改EXTRA_INCOMING_NUMBER可能有一个值(根据上面的情况),所以不要忽略重复的状态更改(if (state.equals(mLastState)) return),只有当EXTRA_INCOMING_NUMBER的值为null时,才应该跳过它。

以下是来自文档的相关片段:

此额外部分仅用于已被授予Manifest.permission.READ_CALL_LOG和Manifest.permission.READ_PHONE_STATE权限的Manifest.permission.READ_CALL_LOG广播接收器。 对于来电,只有当EXTRA_STATE从EXTRA_STATE_IDLE更改为EXTRA_STATE_RINGING时,才能保证填充电话号码。如果传入调用方来自未知号码,则将使用空字符串填充额外的调用方。对于打出去的电话,只有当EXTRA_STATE从EXTRA_STATE_IDLE更改为EXTRA_STATE_OFFHOOK时,才能保证填充电话号码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66096408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档