BroadcastReceiver 和 PHONE_STATE 不起作用
Posted
技术标签:
【中文标题】BroadcastReceiver 和 PHONE_STATE 不起作用【英文标题】:BroadcastReceiver and PHONE_STATE does not work 【发布时间】:2018-01-12 06:17:12 【问题描述】:我正在尝试使用 BroadcastReceiver
和 READ_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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
BroadcastReceiver和EventBus区别是什么
BroadcastReceiver的使用,动态注册和注销,优先级和中断控制
BroadcastReceiver 和 ReentrantLock。有啥问题吗?