Android - Não é possível ativar o BroadCastreceiver
-
20-09-2019 - |
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
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.