Obtener Excepción al mostrar el cuadro de diálogo de alerta de servicio – No se puede agregar ventana – el símbolo nulo no es para una aplicación

Obtener excepción al mostrar el cuadro de diálogo de alerta del servicio.

A continuación se muestra el código en mi clase de servicio: Estoy intentando mostrar un AlertDialog.

Pero me sale el error: No se puede agregar window-token null no es para una aplicación

También adjunto una instantánea de mi registro a esta pregunta.

if(!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)&& !mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ Log.d("TrackingService","H: Exception after this"); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Your GPS seems to be disabled, do you want to enable it?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, final int id) { startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, final int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } 

Introduzca aquí la descripción de la imagen

Tengo este problema, pero ahora está solved , si quieres ejecutar realmente un alertDialog de un servicio, deberías configurar el diálogo como System Alert y recuerda agregar permiso en tu AndroidManifest.xml:

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

/ Aquí está el código de ejemplo:

 AlertDialog.Builder builder = new AlertDialog.Builder(ctx); builder.setTitle("Test dialog"); builder.setIcon(R.drawable.icon); builder.setMessage("Content"); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //Do something dialog.dismiss(); } }); builder.setNegativeButton("Close", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); alert.show(); 

Usted debe guardar algunas de las cosas en su mente mientras que crea su gui:

  1. Todo el trabajo que no consume mucho tiempo debe hacerse en segundo plano (usando asyncTask, Servicios, Hilos, etc.).

  2. GUI (como las vistas y otros objetos gráficos) siempre se debe crear y actualizar desde UIthreads.

Así que crear y mostrar el diálogo es un trabajo de interfaz de usuario por lo que debe estar en el hilo de interfaz de usuario. Para ejecutar cualquier código en el subproceso de la interfaz de usuario, puede utilizar diferentes métodos como:

  1. Puede utilizar runOnUiThread para ejecutar un fragmento de código en el subproceso de UI.
  2. Puede utilizar messageHandler.
  3. Puede utilizar Emisor y receptor de difusión.

Creo que para su caso runOnUiThread es mejor Así que utilice

 runOnUiThread (new Runnable() { public void run () { // WRITE YOUR PIECE OF CODE HERE TO UPDATE OR CREATE GUI. } }); 

Para entender el concepto esto puede ayudarle:

http://developer.android.com/guide/components/processes-and-threads.html

Para crear difusión puede utilizar:

Paso 1: Cree un receptor de difusión en su actividad desde donde está iniciando su servicio.

  BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("create_dialog")) { // create your dialog here. } } }; 

Paso 2: Registre su receptor después de crear su receptor de difusión.

 IntentFilter filter = new IntentFilter("create_dialog"); registerReceiver(receiver, filter); 

Paso 3: Envíe la transmisión desde su servicio al cuadro de diálogo de visualización.

 Intent intent = new Intent("create_dialog"); intent.putExtra("dialog_data", data_object to display in dialog); SendBroadcast(intent); 

Espero que esto pueda ayudarte.

En lugar de crear una nueva actividad transparente, utilice el permiso SYSTEM_ALERT_WINDOW para hacer esto

 public void onReceive(Context ctx, Intent intent) { LayoutInflater inflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View popup = inflater.inflate(R.layout.mypopup, null, false); CustomDialog dialog = new CustomDialog(ctx, popup ); dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation; dialog.show(); } 

Prueba esto.

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(myContext); 

Editar.

Perdón por no hacer comentarios. Coloque el contexto que inició su servicio como una instancia en servicio y utilícelo.

 class SomeService { private final Context myContext; public WebService(Context myContext) { this.myContext= myContext; } public void showDialog() { AlertDialog d = new AlertDialog.Builder(myContext); } } 

Usted puede hacer cosas UI como mostrar un AlertDialog sólo en el hilo de interfaz de usuario. Y dado que su service no se ejecuta en el subproceso de la interfaz de usuario, recibe esta excepción.

Intente usar runOnUiThread para mostrar la alerta: –

 if(!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)&& !mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ runOnUiThread(new Runnable(){ public void run(){ Log.d("TrackingService","H: Exception after this"); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Your GPS seems to be disabled, do you want to enable it?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, final int id) { startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, final int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } }); } 
  • ¿Cómo utilizar PendingIntent para comunicarse desde un servicio a un cliente / actividad?
  • ¿Por qué mis intenciones no se entregan correctamente?
  • Análisis BLE de Android en el servicio de fondo
  • No se puede iniciar el servicio Intención {flg = 0x4 cmp = com.UserLogin / .BgService (tiene extras)}: no encontrado
  • Android service stopSelf (int)
  • ¿Cómo puedo detener el servicio de otra aplicación en Android?
  • El servicio Android se bloquea después de que la aplicación se borre de la lista de aplicaciones recientes
  • No se puede realizar la sincronización (onPerformSync no se llama)
  • No se puede iniciar el servicio con null
  • ¿cuál es el mejor enfoque para escanear filesytem para archivos mp3 en android?
  • Android O: Servicio no detenido por límites de ejecución de fondo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.