Desarrollo de Android: actividad de inicio desde el servicio

Tengo un poco de código que está escuchando un mensaje en un socket y analizando los datos del socket en un correo electrónico para enviarlo. Puedo crear la intención y establecer la bandera FLAG_ACTIVITY_NEW_TASK en ella, pero aún así, cuando llamo startActivity(Intent.createChooser(intent, "Email"));

Recibo una AndoridRuntimeException: llamar a startActivity () desde fuera de un contexto de actividad requiere el indicador FLAG_ACTIVITY_NEW_TASK. ¿Es esto realmente lo que quieres?

Lo que me confunde sobre esto es que he llamado explícitamente intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

¿Me estoy perdiendo algo obvio aquí?

protected void doEmail(DataInputStream in)  throws IOException {
  String id = in.readUTF();
  createEmail(id);
}

protected void createEmail(String rawEmailString) {
  // need to get to, subject, body and path from string
  String[] stringArray = rawEmailString.split("~");
  Intent intent = prepareEmail(stringArray[0], stringArray[1], stringArray[2], stringArray[3]);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(Intent.createChooser(intent, "Email"));
}

public Intent prepareEmail(String to, String subject, String body, String pathToAttachment){
  Intent intent = new Intent(Intent.ACTION_SEND);
  intent.putExtra(Intent.EXTRA_EMAIL, to);
  intent.putExtra(Intent.EXTRA_TEXT, body);
  intent.putExtra(Intent.EXTRA_SUBJECT, subject);
  intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(pathToAttachment));
  intent.setType("*/*");

  return intent;
}

preguntado el 16 de mayo de 11 a las 18:05

Eso parece correcto. Intente simplemente startActivity (intent) en lugar de usar el selector. -

Gracias Robby, eso me ayudó a moverme en la dirección correcta. ahora me pregunta si quiero abrir con correo electrónico o gmail. se abre bien si selecciono gmail, pero si selecciono correo electrónico, se muestra un cuadro de diálogo que dice "El correo electrónico de la aplicación (proceso com.google.android.email) se detuvo inesperadamente. Vuelva a intentarlo. ¿Esta sintaxis no es compatible con el estándar? ¿Cliente de correo electronico? -

¿Hay una cuenta de correo electrónico configurada en la aplicación de correo electrónico? -

es. He estado recibiendo mi correo electrónico sin problemas durante semanas. Lo estoy restableciendo e intentando configurarlo nuevamente para ver si eso ayuda. -

El otro problema es que si intento enviar desde gmail, puedo ver el archivo adjunto, pero obtengo un error de archivo adjunto tan pronto como lo envío, y el correo electrónico se envía sin el archivo. No estoy seguro de si estos dos problemas están relacionados o no. -

1 Respuestas

La Intent regresas de createChooser() puede que no tenga su bandera. Intente agregarlo al resultado de createChooser().

Tenga en cuenta que:

  • Hacer que un servicio muestre una actividad es muy inusual y el usuario debería poder desactivarlo, ya que puede ser muy intrusivo.

  • Tener un servicio emergente como selector es una pésima experiencia de usuario. ¿De verdad crees que tus usuarios van a tener alguna idea de lo que está sucediendo cuando este diálogo de selección de "Correo electrónico" aparezca de la nada?

contestado el 17 de mayo de 11 a las 00:05

CommonsWare: de hecho eliminé eso, según la sugerencia de Robby anterior, y como señalé, ahora avanza, pero parece que la aplicación de correo electrónico está bloqueando, o si elijo gmail, se inicia, pero se envía sin el archivo adjunto. El método actualmente dice `protected void createEmail (String rawEmailString) {// es necesario llegar al asunto, el cuerpo y la ruta de la cadena String [] stringArray = rawEmailString.split (" ~ "); Intención Intención = prepareEmail (stringArray [0], stringArray [1], stringArray [2], stringArray [3]); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); startActivity (intención); } `- Jeff

@Jeff: Usar adb logcat, DDMS o la perspectiva de DDMS en Eclipse para examinar LogCat y observar el seguimiento de la pila asociado con su falla. Es de suponer que esas aplicaciones no pueden leer su archivo adjunto. - CommonsWare

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.