Android接收器忽略新的\u传出\u呼叫
我有一个带有意图过滤器的广播接收器,用于捕捉android.intent.action.NEW\u传出的呼叫 我阅读了很多教程,并在这里回答了关于处理新的呼出呼出意图的问题,但我无法使这件事起作用。 我的目标是记录Broadcastreceiver接收到的intent android.intent.action.NEW_OUTGOING_呼叫。我无法使这件简单的事情起作用 这是我的密码: Manifest.xmlAndroid接收器忽略新的\u传出\u呼叫,android,android-intent,broadcastreceiver,android-phone-call,Android,Android Intent,Broadcastreceiver,Android Phone Call,我有一个带有意图过滤器的广播接收器,用于捕捉android.intent.action.NEW\u传出的呼叫 我阅读了很多教程,并在这里回答了关于处理新的呼出呼出意图的问题,但我无法使这件事起作用。 我的目标是记录Broadcastreceiver接收到的intent android.intent.action.NEW_OUTGOING_呼叫。我无法使这件简单的事情起作用 这是我的密码: Manifest.xml <?xml version="1.0" encoding="utf-8"?&
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.vannus.broadcasttest">
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".TestReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
</application>
</manifest>
该项目还包含一个空的MainActivity,没有任何功能。
执行项目主要活动是启动,但当我尝试拨打或接听电话时,不会写入日志。
我在模拟器(安卓7)和摩托罗拉G4手机(安卓6.0)上测试了代码,但logcat上没有任何记录。
我正在使用Android Studio 2.3
我做错了什么
谢谢
Vannus解决方案非常简单。。。。在手机上,进入设置->应用程序,选择应用程序并授予手机权限。 在搜索logcat时发现了线索我发现了这个错误
03-05 20:18:57.090 1547-1775/system_process W/BroadcastQueue:权限拒绝:接收意图{act=android.Intent.action.NEW_OUTGOING_CALL flg=0x1000010(有额外功能)}到net.vannus.broadcasttest/.TestReceiver需要android.Permission.process_OUTGOING_CALLS由于发送方安卓(uid 1000)的原因而产生的呼叫。,应用程序已经有了权限,但由于某种原因,当我声明
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter
android Oreo的问题在于,对于“危险”类型的权限(其中PROCESS_OUTGOING_CALLS是其中之一),仅在清单中声明是不够的。您需要特别提示用户授予此权限。这可以使用下面讨论的框架来完成:
具体来说,您需要使用实际需要的权限数组基本上调用“requestPermissions”,它将要求用户批准这些权限
就我个人而言,我觉得这很烦人,但我明白了背后的道理。检查权限运行时间
@TargetApi(Build.VERSION_CODES.M)
public static boolean hasSelfPermission(Activity activity, String[] permissions) {
// Below Android M all permissions are granted at install time and are already available.
if (!isMNC()) {
return true;
}
// Verify that all required permissions have been granted
for (String permission : permissions) {
if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
并使用此方法检查权限
@TargetApi(Build.VERSION_CODES.M)
private boolean isReadStatePermission() {
if (hasSelfPermission((Activity) context, READ_PHONE_STATE)) {
return true;
} else {
if (((Activity) context).shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
} else {
((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
}
return false;
}
检查权限后执行任何操作
if (isReadStatePermission()) {
PERFROM YOUR OPERATION
}
@TargetApi(Build.VERSION_CODES.M)
private boolean isReadStatePermission() {
if (hasSelfPermission((Activity) context, READ_PHONE_STATE)) {
return true;
} else {
if (((Activity) context).shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
} else {
((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
}
return false;
}
if (isReadStatePermission()) {
PERFROM YOUR OPERATION
}