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);
}
}
}我检查并尝试了所有堆叠溢出的问题和答案。但是,该程序在以下位置引发异常:
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:
String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);我尝试了许多其他事情,比如添加READ_CALL_LOG。但没起作用。连祝酒词都没显示出来。有办法解决吗?
发布于 2021-02-09 08:41:12
这是API的预期行为,根据医生的说法有两种情况,您将在EXTRA_INCOMING_NUMBER中获得null
READ_CALL_LOG权限,您已经在应用程序中说过了,但是请注意,仅将其添加到清单中是不够的,您需要实现运行时权限才能实际接收它。EXTRA_STATE_IDLE、=>、EXTRA_STATE_RINGING或EXTRA_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时,才能保证填充电话号码。
https://stackoverflow.com/questions/66096408
复制相似问题