Pergunta

Voltei ao desenvolvimento do widget depois de atualizar para o mais recente SDK e, de repente, meu widget está falhando na startup com esta mensagem:

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

Aqui estão duas linhas de código onde a exceção ocorre:

@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);
}

Então, no código acima startAlarm() nunca é executado desde pm.setComponentEnabledSetting() lança a segurança da Us.

Estou perdendo alguma configuração de segurança no meu manifesto? Atualmente eu tenho:

<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" />

Estou desenvolvendo SDK v. 1.5 E costumava funcionar bem

Ps acontece no telefone e o emulador

Foi útil?

Solução 3

OK - isso não é realmente uma resposta, mas uma solução alternativa. Se alguém quiser intervir e fornecer respostas ou explicações sobre como isso deve ser feito, eu aceitaria com prazer isso. Enfim - eu consegui funcionar mudando newState bandeira de COMPONENT_ENABLED_STATE_ENABLED para PackageManager.COMPONENT_ENABLED_STATE_DEFAULT. Como meu receptor de transmissão permitiu o estado no manifesto, ele funciona muito bem

Outras dicas

No manifest.xml você adicionará

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

No Android.mk adicionará

LOCAL_CERTIFICATE := platform  

Isso é tudo.

Você pode tentar adicionar essa permissão no seu manifesto?

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

Só recebi este erro "Java.lang.SecurityException: Negação de permissão:" Quando tento desativar algum componente do pacote em que está sendo executado. Além disso, obtive sucesso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top