0

我已经实现了一个隐式广播接收器来收听电话

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


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

我编译并制作了目标 26,但我的广播接收器仍然像往常一样工作。

正如我在这里读到的https://developer.android.com/preview/features/background.html#broadcasts这应该不再起作用了。

谁能告诉我我的广播是否有异常android.permission.READ_PHONE_STATE

4

2 回答 2

1

您确定您确实将编译 SDK 和构建工具设置为 26 版吗?

compileSdkVersion 26
buildToolsVersion "26.0.0"

该动作的意图没有隐式广播异常android.intent.action.PHONE_STATE,因为此意图不直接针对您的应用程序,并且未列为异常,因此即使这在 Android O 的预览版中也有效,它可能不再适用于Android O的生产版本。

一个例外的意图示例是带有 action 的意图android.intent.action.MY_PACKAGE_REPLACED,因为该意图针对一个特定的应用程序,该应用程序正在更新。

总体思路是通过不使用通用广播不必要地唤醒所有应用程序来节省电力(电池使用)。

您可以通过在服务中注册广播接收器来解决此问题,您可能希望将其作为前台服务,因为Android O 中的后台服务也存在限制。前台服务强制显示通知(可以是最低优先级,因此相关图标不会出现在状态栏中,至少在 Google 的 Android 版本中)。这里的想法是用户应该知道任何可能使用电池电源的事情。

于 2017-07-13T14:16:31.303 回答
0

实际上,“targeting”不是指编译版本,而是“target”版本。因此,请检查您的 build.gradle 中是否有下一行:

defaultConfig {
    applicationId 'com.yourid'
    targetSdkVersion 26
}

例如,您的应用程序可以在较新的应用程序上编译,但以以前的应用程序为目标:

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"

    defaultConfig {
        applicationId 'com.yourid'
        minSdkVersion 21
        targetSdkVersion 25
}
于 2018-04-12T18:42:33.107 回答