为什么这个广播接收器在安卓5.0及以上版本不起作用?

3

我在清单文件中声明了这个广播接收器:

    <receiver android:name="classes.VoiceLaunchReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.USER_PRESENT" />
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

当用户解锁并打开屏幕时,它会自动运行。在Jellybean 4.3及更低版本中,它可以完美运行。为什么它在Lollipop上无法正常工作?

(我已经知道系统会发送该意图,我想要的是使用我的接收器来检测它)


这可能是一个框架的 bug,但是还没有其他关于这个问题的报告。也有可能是 Intent.ACTION_USER_PRESENT 有一些注意事项:1) 它只会在用户解锁 Keyguard 时发送。如果他们没有锁屏,这个 intent 就不会被发送。2) 如果用户在启动前解锁设备,则只会发送给已注册的接收器。没有 BroadcastReceiver 组件会被启动。 - alanv
暂时将你对于为什么这个不起作用的抱怨从帖子中移除。在你冷静下来之前,这个帖子被锁定了。如果你有问题,可以去 Meta 发问。 - Taryn
1
你可能需要提供更多的细节。这对我来说在 Nexus 4 上运行 Lollipop 完美地工作。我只是创建了一个新的 Hello World 活动,将你的接收器声明添加到清单中,创建了一个仅记录 intent.getAction() 的接收器,运行应用程序,锁定屏幕,解锁屏幕,然后 voila,onReceive 被调用并记录操作。也许你可以自己创建一个 http://stackoverflow.com/help/mcve,看看它能为你带来什么。 - ci_
@ci_ 你好,看看我下面的答案,你是正确的。 - Josh
@ci_ 请看一下我的问题 http://stackoverflow.com/q/41032943/6852390 - Mr.Popular
1个回答

1

好的,我通过添加两个东西解决了这个问题:一个权限和一个接收器意图过滤器中的类别标签。以下是清单中的所有内容:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <receiver android:name="classes.VoiceLaunchReceiver" >        
             <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

有时当我尝试制作自己的项目时,我没有看到原始的Android演示具有权限。

我既不需要权限也不需要类别。但我必须从接收器中去掉“exported =“ false””。在安装有Android 5的正式版上进行了测试。 - OneWorld
我一开始没有设置exported=false... @OneWorld - Josh
我只想说,我的接收器在没有声明类别和权限的情况下工作。Google文档也没有提到权限方面的内容。然而,在Lollipop stock上删除“exported =”false“”对我有帮助。 - OneWorld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接