2012-05-29 12 views
6

Estoy desarrollando una aplicación que necesita una cuenta de Google para ciertas opciones. Las opciones están deshabilitadas cuando no se detecta una cuenta, pero le presento al usuario que agregue una preguntando mediante una ventana emergente; si el usuario hace clic en sí, la actividad debería comenzar. Está funcionando bien para mostrar la página global "Agregar cuenta", pero quiero omitir ese paso extra sin llamar. Después de todo, por qué presentar a alguien con la opción de agregar una cuenta de Exchange si se necesita una cuenta de Google, eso es simplemente confuso. Por lo tanto, quiero establecer de forma predeterminada la nueva página de configuración de la cuenta de Google.Iniciando programáticamente la actividad 'Agregar cuenta de Google' en Android

Java

try { 
    Intent intent = new Intent(); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setClassName("com.google.android.gsf", "com.google.android.gsf.login.AccountIntroActivity"); 

    //if(getApplicationContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) { 
     getApplicationContext().startActivity(intent); 
    //} else { 
     //getApplicationContext().startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
    //} 
} catch (ActivityNotFoundException e) { 
    e.printStackTrace(); 
} 

Cuando ejecuto esto, el siguiente exeception se lanza:

05-29 18: 24: 50.741: W/System.err (10875): android.content .ActivityNotFoundException: no se puede encontrar la clase de actividad explícita {com.google.android.gsf/com.google.android.gsf.login.AccountIntroActivity}; ¿Has declarado esta actividad en tu AndroidManifest.xml?

AndroidManifest.xml

<activity 
     android:name="com.google.android.gsf.login.AccountIntroActivity"/> 

PREGUNTA: lo que me estoy perdiendo aquí?

EDIT:

me trataron de una manera diferente usando addAccount, esto no funciona, no pasa nada, no hay errores se tiran, ninguna nueva actividad comienza a agregar la cuenta de Google. Por cierto, todo el bloque try catch en la versión original está en un AlertDialog/listener.

AccountManager acm = AccountManager.get(); 
acm.addAccount("com.google", null, null, null, null, null, null);   

Respuesta

6

Ok, el problema al usar el modo AccountManager era que el contexto de actividad no estaba siendo utilizado por mí en absoluto en la llamada al método, o no correctamente. Teniendo en cuenta el hecho de que se utilizó en un DialogInterface, esto funciona:

private void popup() { 
    AlertDialog.Builder helpBuilder = new AlertDialog.Builder(this); 
    helpBuilder.setTitle("Add Gmail account"); 
    helpBuilder.setMessage("These options rely on a Gmail account, but you 
    don't seem to have one configured. Would you like to configure one now?"); 

    helpBuilder.setPositiveButton("Yes", 
    new DialogInterface.OnClickListener() { 
     //@Override 
     public void onClick(DialogInterface dialog, int which) { 
      //try/ catch block was here 
      AccountManager acm = AccountManager.get(getApplicationContext()); 
      acm.addAccount("com.google", null, null, null, thisclassname.this, 
      null, null); 
      } 
    }); 

    helpBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // close the dialog, return to activity 
     } 
    });  

    AlertDialog helpDialog = helpBuilder.create(); 
    helpDialog.show(); 
}//end method 

Esto probablemente necesita un poco más de trabajo para poder utilizar en realidad el nombre de la cuenta configurada, pero por ahora, esto responde a la P.

Lamentablemente, esto requiere un permiso, pero supongo que así son las cosas

+0

Me siento como un idiota, pero supongo que tengo que marcar mi propia respuesta como respondí ahora. Gracias por toda su paciencia y ayuda @Nikolay Elenkov! – slinden77

+0

¿Es "thisclassname" una clase real? –

4

usted está tratando de manera efectiva a utilizar una API privada - el nombre de clase de la actividad añadir cuenta de Google puede cambiar, o que ya no sean iguales en diferentes versiones de Android. Se encuentra en uno de los paquetes de servicios de Google, y ciertamente no debe agregar su nombre a su manifiesto. En resumen, este es un truco, no lo hagas. ¿No funciona AccountManager.addAcount("com.google",...) para usted (necesita el permiso MANAGE_ACCOUNTS)?

+0

Sé que tienes razón, pero aún así prefiero mi camino. Probé el método addAccount, pero francamente, simplemente no funcionó para mí. Aparte de eso, esto requiere un permiso adicional, que para mí parece inútil. Puedo entender este permiso para el método addAccountExplicitly, porque esto agrega una cuenta silenciosamente, pero todas las cuentas addAccount invocan una actividad nueva, que maneja su propio trabajo, la aplicación en realidad no gestiona/modifica/crea nada. Pero supongamos que cambio de opinión, ¿podría publicar un ejemplo que debería funcionar? Lo intenté, con com.google type y rest null's, no funcionó – slinden77

+0

Veo su punto, pero en realidad está agregando una cuenta, aunque con interacción del usuario, por lo que tiene sentido.Sé que podría asustar a algunos usuarios sin embargo. Tendré que volver a consultar, pero IIRC, siempre que tenga el permiso, "com.google" y el resto 'null' deberían funcionar. Qué error estás recibiendo. –

+0

Tiene razón, el sitio para desarrolladores de Android indica claramente que se requieren permisos para iniciar una nueva actividad. De alguna manera eludí mi problema al cambiar intent.setClassName (com.google.android.gsf, ...) a (com.google.android.gsf.login). Mi pista estaba en la consola donde traté de descubrir qué estaba sucediendo cuando utilicé el paso extra, la página global de agregar cuenta. Ahora tengo un nuevo problema, me pide una contraseña y muestra un error de inmediato sobre la imposibilidad de comunicarse con los servidores de Google. No recibo ningún error cuando uso el método addAccount ... pero aún así no funciona ... ¡thx! – slinden77

Cuestiones relacionadas