Android - не могу включить BroadcastReceiver - PullRequest
3 голосов
/ 13 января 2010

Я вернулся к разработке виджета после обновления до последней версии 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, и он работал нормально

P.S. Бывает на телефоне и эмуляторе

Ответы [ 4 ]

3 голосов
/ 26 июня 2012

В файле manifest.xml вы добавите

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

На Android.mk добавим

LOCAL_CERTIFICATE := platform  

это все.

1 голос
/ 17 января 2012

Можете ли вы попробовать добавить это разрешение в свой манифест?

<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
0 голосов
/ 08 ноября 2011

Я получил только эту ошибку "java.lang.SecurityException: Permission Denial:" при попытке отключить какой-либо компонент из пакета, в котором он запущен. В противном случае я получил успех.

0 голосов
/ 13 января 2010

ОК - это не совсем ответ, а скорее обходной путь. Если кто-то захочет вмешаться и дать ответ или объяснить, как это следует сделать, я с радостью приму это. В любом случае - я заработал, изменив флаг newState с COMPONENT_ENABLED_STATE_ENABLED на PackageManager.COMPONENT_ENABLED_STATE_DEFAULT. Так как мой широковещательный приемник включил состояние в манифесте, он работает просто отлично

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...