升级到最新的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 而且过去正常工作

ps发生在电话和模拟器上

有帮助吗?

解决方案 3

好的 - 这不是真正的回答,而是解决方法。如果有人想介入并提供有关如何做到这一点的答案或解释,我将很乐意接受。无论如何 - 我通过更改来工作 newState 旗帜来自 COMPONENT_ENABLED_STATE_ENABLEDPackageManager.COMPONENT_ENABLED_STATE_DEFAULT. 。由于我的广播接收器已在清单中启用了状态,因此可以正常工作

其他提示

在清单上,您将添加

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

在android.mk上会添加

LOCAL_CERTIFICATE := platform  

这是所有的了。

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

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

我只有此错误“ java.lang.securityexception:denial denial:”当我尝试将某些组件从其运行的软件包中禁用时。否则,我取得了成功。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top