BroadcastReceiver 和 PHONE_STATE 不起作用

Posted

技术标签:

【中文标题】BroadcastReceiver 和 PHONE_STATE 不起作用【英文标题】:BroadcastReceiver and PHONE_STATE does not work 【发布时间】:2018-01-12 06:17:12 【问题描述】:

我正在尝试使用 BroadcastReceiverREAD_PHONE_STATE 权限。我要求用户获得运行权限(android M),但毕竟我得到以下权限拒绝:

W/BroadcastQueue: Permission Denial: 接收 Intent act=android.intent.action.PHONE_STATE flg=0x10(有附加功能) 到 com.pb.qostest/.network.PhoneStateBroadcastReceiver 需要 android.permission.READ_PRIVILEGED_PHONE_STATE 由于发件人 android (uid 1000)

对于权限,我使用的是来自此链接的代码:https://***.com/a/38764861

到目前为止,我希望我的手机状态 BroadcastReceiver 只打印一些东西,所以它看起来像这样:

public class PhoneStateBroadcastReceiver extends BroadcastReceiver 
    @Override
    public void onReceive(Context context, Intent intent)    
         Log.d("RECEIEVER", "PhoneStateBroadcastReceiver Receiver started!");
    

由于上面的许可拒绝,无论如何都不会打印任何内容。

在清单中是:

<receiver
    android:name=".network.PhoneStateBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>
...
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

知道它看起来应该如何相似或有什么问题吗?

【问题讨论】:

@shemekh 这是一个已知的错误,用于读取 android M 上的组权限,特别是具有电话状态。你能告诉我你想达到什么状态吗?你想做电话之类的吗?解释一下你的应用程序 @kapsym 我想检测通话并在通话期间收集一些数据,即信号强度。我想为此目的使用 BroadcastReceiver,因为我希望应用即使不在最近的应用中也能正常工作。 【参考方案1】:

为了能够检测到电话,您需要:

1 在 Manifest.xml 中,定义您的接收器并请求 PHONE_STATE 权限:

<receiver android:name=".network.PhoneStateBroadcastReceiver">
<intent-filter>
  <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>
// ...
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

2 添加一个扩展 BroadcastReceiver 并覆盖 onReceive() 的类 PhoneStateBroadcastReceiver

3 在运行时,request PHONE_STATE 权限预先

    ActivityCompat.requestPermissions(myMainActivity,
            new String[]Manifest.permission.READ_PHONE_STATE,
            READ_PHONE_STATE_CODE);

并通过系统对话框提供

4 打个电话

你会看到 onReceive() 中的意图:

intent: Intent  act=android.intent.action.READ_PHONE_STATE flg=0x10 cmp=com.myApp.network.PhoneStateBroadcastReceiver (has extras) 
Action: android.intent.action.PHONE_STATE

希望对你有帮助

【讨论】:

没有广播事件是什么意思?据我了解 BroadcastReceiver,PHONE_STATE 上的事件应该在正在进行的通话中触发。在此之前,在我的主要活动中,我要求用户获得 READ_PHONE_STATE 权限,所以我明白应该在接受后授予它。我应该在 onReceive 方法中请求许可吗?这对我来说似乎很奇怪。 对不起第二个答案,但我无法编辑前一个。我通常想要做的与此网址上的相同:theappguruz.com/blog/detecting-incoming-phone-calls-in-android 问题是由于某种原因,当它与 Android M 和运行权限有关时,它不能像那样工作。 @shemekh 很好,你解释了你想要做什么,从一开始就更容易说出来。要检测来电,你提供的链接中的信息就足够了,我刚刚测试过,我可以进入接收器Action: android.intent.action.PHONE_STATE,所以你肯定做错了什么。只需一步一步地进行:在清单中定义接收者,在清单中添加权限,在运行时请求电话权限并通过对话框给予,拨打电话;你应该很好。 用工作代码相应地更新我的答案,这样你就可以检查你错过了什么 老实说,我不知道是什么让它起作用的,但是你的信息对你有用,让我再试一次。清除手机上的应用程序,改变运行权限询问的方式,它现在就像一个魅力。感谢您的所有帮助!

以上是关于BroadcastReceiver 和 PHONE_STATE 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

READ_PHONE_STATE 的权限被拒绝 [重复]

BroadcastReceiver和EventBus区别是什么

BroadcastReceiver的使用,动态注册和注销,优先级和中断控制

BroadcastReceiver 和 ReentrantLock。有啥问题吗?

具有 ResultReceiver 和生命周期的 BroadcastReceiver

如何从 BroadcastReceiver 在 Activity 中发送和保存字符串消息