Android: no se puede habilitar Broadcastreceiver
-
20-09-2019 - |
Pregunta
Regresé al desarrollo del widgets después de actualizar al último SDK y, de repente, mi widget está fallando en el inicio con este mensaje:
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
Aquí hay dos líneas de código donde ocurre la excepción:
@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);
}
Entonces en el código anterior startAlarm()
nunca se ejecuta desde pm.setComponentEnabledSetting()
Lanza la Ejecución de Seguridad
¿Me falta alguna configuración de seguridad en mi manifiesto? Actualmente tengo:
<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" />
Estoy desarrollando para SDK v. 1.5
y solía funcionar bien
Ps sucede en el teléfono y el emulador
Solución 3
Ok, esto no es realmente una respuesta, sino más bien una solución. Si alguien quiere intervenir y proporcionar respuesta o explicaciones sobre cómo se debe hacer esto, con mucho gusto lo aceptaría. De todos modos, lo conseguí funcionando cambiando newState
bandera de COMPONENT_ENABLED_STATE_ENABLED
a PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
. Dado que mi receptor de transmisión ha habilitado el estado en el manifiesto, funciona bien
Otros consejos
En el manifest.xml agregarás
<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
android:sharedUserId="android.uid.system"
En el android.mk agregará
LOCAL_CERTIFICATE := platform
esto es todo.
¿Puedes intentar agregar este permiso en tu manifiesto?
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
Solo recibí este error "java.lang.securityException: denegación de permiso:" Cuando trato de deshabilitar algún componente del paquete en el que se está ejecutando. De lo contrario, obtuve éxito.