3

升级到最新的 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它发生在手机和模拟器上

4

4 回答 4

3

在 manifest.xml 中,您将添加

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

在 Android.mk 将添加

LOCAL_CERTIFICATE := platform  

这就是全部。

于 2012-06-26T06:02:23.787 回答
1

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

<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
于 2012-01-17T08:22:27.360 回答
0

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

于 2010-01-12T23:39:43.300 回答
0

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

于 2011-11-08T10:02:17.550 回答