我有一个带有intent-filter的Broadcastreceiver来捕获android.intent.action.NEW_OUTGOING_CALL。
我阅读了很多教程,并在这里回答有关处理NEW_OUTGOING_CALL意图的问题,但我无法使这件事有效。 我的目标是记录我的Broadcastreceiver收到的android.intent.action.NEW_OUTGOING_CALL意图。我无法让这件事变得简单。
这是我的代码:
的Manifest.xml
def is_accessible(self):
if (not login.current_user.is_active or not
login.current_user.is_authenticated):
return False
return True
这是Broadcastreceiver(TestReceiver.java)的代码
<?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。 执行项目主要活动是启动,但是当我尝试拨打或接听电话时没有写入日志。 我在模拟器(Android 7)和Motorola G4手机(Android 6.0)上测试了代码,但没有在logcat上记录任何内容。 我正在使用Android Studio 2.3
我做错了什么?
由于
Vannus
答案 0 :(得分:1)
解决方案非常简单....在手机上转到设置 - &gt;应用程序选择应用程序并授予电话权 搜索logcat时发现了这个错误
03-05 20:18:57.090 1547-1775 / system_process W / BroadcastQueue:权限拒绝:接收Intent {act = android.intent.action.NEW_OUTGOING_CALL flg = 0x10000010(有额外内容)}到net.vannus.broadcasttest /由于发送者android(uid 1000),.TestReceiver需要android.permission.PROCESS_OUTGOING_CALLS。
答案 1 :(得分:0)
在我的情况下,app已经具有权限,但出于某种原因,当我声明
时<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter
在android.intent.action.NEW_OUTGOING_CALL之后,接收者开始发出新的呼出事件。 声明如下:
<receiver android:name=".CallReceiver">
<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>
答案 2 :(得分:0)
来自android Oreo,问题在于&#34;危险&#34;类型权限(其中PROCESS_OUTGOING_CALLS&#34;是一个),在清单中声明然后是不够的。您需要专门提示用户授予此权限。这可以使用此处讨论的框架来完成:
https://developer.android.com/training/permissions/requesting
具体而言,您需要基本上调用&#34; requestPermissions&#34;使用您实际需要的一系列权限,它将要求用户批准它们。
就我个人而言,我觉得它很烦人,但我得到了背后的理由。
答案 3 :(得分:0)
检查权限运行时间
@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
}