广播接收器允许拒绝

时间:2015-09-05 05:15:52

标签: java android android-intent permissions broadcastreceiver

我正在尝试创建一个应用程序,当我拨打电话时输入日志消息。

但是,当我运行代码时,尽管我已经输入了权限,但我仍然拒绝了权限。

拒绝记录:

“09-04 02:35:50.535 1294-1666 /?W / BroadcastQueue:权限拒绝:接收Intent {act = android.intent.action.NEW_OUTGOING_CALL flg = 0x10000010(有额外内容)}到samples.varma.packagecom .testreceive2 / .CallReceiver需要android.permission.PROCESS_OUTGOING_CALLS由于发件人android(uid 1000)“

清单代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="samples.varma.packagecom.testreceive2" >
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="23" />


    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >


        <activity
            android:name=".MainActivity"
            android:enabled="true"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <receiver
            android:name=".CallReceiver">


            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"/>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>
    </application>


</manifest>

这是我的接收器的代码:

package samples.varma.packagecom.testreceive2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

public class CallReceiver extends BroadcastReceiver {
    public CallReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        if (state == null) {
            String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.i("TAG", "Outgoing Number: " + number);
        } else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.i("TAG", "Incoming Number: " + number);
        }
    }
        }

我对此非常陌生,因此很有可能存在多个错误,或者我完全偏离基础。无论我多么感激任何指导。有谁知道为什么我会拒绝这个?

由于

编辑:

即使我已添加手机状态权限,它也会拒绝这些权限。

特权电话状态权限是系统权限,因此我无法添加。

09-04 04:36:03.249    1294-1440/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } to samples.varma.packagecom.testreceive2/.CallReceiver requires android.permission.READ_PRIVILEGED_PHONE_STATE due to sender android (uid 1000)
09-04 04:36:03.271    1294-1308/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } to samples.varma.packagecom.testreceive2/.CallReceiver requires android.permission.READ_PHONE_STATE due to sender android (uid 1000)

 1294-1308/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } to samples.varma.packagecom.testreceive2/.CallReceiver requires android.permission.READ_PHONE_STATE due to sender android (uid 1000)

6 个答案:

答案 0 :(得分:8)

我在Android模拟器上启动了相同的应用程序,没有任何帮助,甚至

android:enabled="true"
android:exported="true"

解决方案是转到设置 - >应用 - &gt; MyApplication - &gt;权限 - &gt;切换电话权限。

Android Phone Permission for Application

答案 1 :(得分:2)

我通过密切关注此链接Intercepting outgoing call - what am I missing?(感谢ajit)

开始工作

我最终取消PHONE_STATE权限,将android:enabled="true"android:exported="true"添加到清单中的接收方,将NEW_OUTGOING_CALL权限重新定位到以下应用程序(不确定是否这是必要的),带走了预期的sdk版本,基本上从链接复制接收器。

从接收器标签到清单标签的更新清单代码是:

    <receiver
            android:name=".testreceive3"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>

                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>-->
            </intent-filter>
        </receiver>
    </application>

     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />>-->

 </manifest>

答案 2 :(得分:1)

当您的代码在Android 6.0或更高版本上运行时,您需要在代码中应用运行时权限。

答案 3 :(得分:0)

您应该在Manifest接收器中添加以下内容

 <service android:name=".CallReceiver"
            android:enabled="true"
            android:exported="false" >
        </service>

答案 4 :(得分:0)

使用权限CALL_PHONE代替OUTGOING

<uses-permission android:name="android.permission.CALL_PHONE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

答案 5 :(得分:0)

最好的解决方案是在运行代码时激活USB调试,请确保在开发人员设置中选择禁用权限监视器设置!操作系统不再会向应用程序询问权限。乐于助人:)

这将起作用,而无需更改清单中的任何内容!