【问题标题】:Android - can't enable BroadcastReceiverAndroid - 无法启用广播接收器
【发布时间】:2010-01-12 21:37:42
【问题描述】:

升级到最新的 SDK 后我回到了小部件开发,突然间我的小部件在启动时失败并显示以下消息:

ERROR/AndroidRuntime(5296): java.lang.RuntimeException: 
Unable to start receiver topjob.widget.SearchWidget: 
java.lang.SecurityException: Permission Denial: 
attempt to change component state from pid=5296, uid=10057, package uid=10048

下面是发生异常的两行代码:

@Override
public void onEnabled(Context context) {
    PackageManager pm = context.getPackageManager();
    pm.setComponentEnabledSetting(new ComponentName("topjob",
            ".widget.SearchWidgetBroadcastReceiver"), 
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
    startAlarm(context, UPDATE_RATE_SEC);
}

所以在上面的代码中,startAlarm() 永远不会执行,因为pm.setComponentEnabledSetting() 会抛出 SecurityException

我的清单中是否缺少任何安全设置?目前我有:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

我正在为SDK v. 1.5 开发,它曾经工作正常

附:它发生在手机和模拟器上

【问题讨论】:

  • 这种行为是否仅限于模拟器的特定操作系统版本?
  • 我没有运行模拟器 - 这是直接在手机上运行的。最新的 SDK、Eclipse 插件、Windows XP 上的 Java 6

标签: android broadcastreceiver securityexception


【解决方案1】:

在 manifest.xml 你将添加

<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
android:sharedUserId="android.uid.system"

在Android.mk会添加

LOCAL_CERTIFICATE := platform  

就这些了。

【讨论】:

  • 它的工作原理。当我禁用应用程序时,在我的应用程序中总是会崩溃。权限拒绝:尝试从 pid=32495、uid=10472、包 uid=10091 更改组件状态
【解决方案2】:

您可以尝试在清单中添加此权限吗?

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

【讨论】:

  • 这仅适用于系统应用,否则此权限将被拒绝。
【解决方案3】:

好的 - 这不是真正的答案,而是一种解决方法。如果有人想介入并提供有关如何完成此操作的答案或解释,我很乐意接受。 无论如何 - 我通过将 newState 标志从 COMPONENT_ENABLED_STATE_ENABLED 更改为 PackageManager.COMPONENT_ENABLED_STATE_DEFAULT 来实现它。由于我的广播接收器已在清单中启用状态,它工作得很好

【讨论】:

    【解决方案4】:

    当我尝试从正在运行的包中禁用某些组件时,我只收到此错误“java.lang.SecurityException: Permission Denial:”。否则,我成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多