2012-05-29 5 views
6

Ich entwickle eine Anwendung, die für bestimmte Optionen ein Google-Konto benötigt. Die Optionen sind deaktiviert, wenn kein Konto gefunden wird, aber ich präsentiere dem Benutzer, dass er einen hinzufügt, indem er über ein Popup fragt. Wenn der Benutzer auf "Ja" klickt, sollte die Aktivität starten. Es funktioniert gut, um die globale "Add account" -Seite anzuzeigen, aber ich möchte das für zusätzlichen Schritt nicht aufgerufenen überspringen. Warum sollte jemand jemandem die Möglichkeit geben, ein Exchange-Konto hinzuzufügen, wenn ein Google-Konto benötigt wird? Das ist einfach verwirrend. Daher möchte ich die neue Einrichtungsseite für Google-Konten als Standard festlegen.Programmgesteuertes Starten der Aktivität "Google-Konto hinzufügen" unter 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(); 
} 

Als ich dies ausführen, wird die folgende exeception geworfen:

05-29 18: 24: 50,741: W/System.err (10875): android.content .ActivityNotFoundException: Die explizite Aktivitätsklasse konnte nicht gefunden werden {com.google.android.gsf/com.google.android.gsf.login.AccountIntroActivity}; Hast du diese Aktivität in deiner AndroidManifest.xml deklariert?

AndroidManifest.xml

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

FRAGE: was ich hier fehlt?

EDIT:

ich eine andere Art und Weise mit addAccount versucht, dies nicht funktioniert, passiert nichts, keine Fehler geworfen, keine neue Aktivität beginnt das Google-Konto hinzuzufügen. Übrigens ist der gesamte try catch-Block in der ursprünglichen Version in einem AlertDialog/Listener.

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

Antwort

6

Ok, das Problem bei der Verwendung von AccountManager war, dass der Aktivitätskontext von mir im Methodenaufruf überhaupt nicht oder nicht korrekt verwendet wurde. In Anbetracht der Tatsache, dass es in einem DialogInterface verwendet wurde, das funktioniert:

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 

Dies ist wahrscheinlich etwas mehr Arbeit muss in der Lage sein, tatsächlich die konfigurierten Kontonamen zu verwenden, aber jetzt, beantwortet dies die Frage:

Leider erfordert dies eine Erlaubnis, aber ich denke, das ist nur, wie die Dinge sind

+0

Ich fühle mich wie ein d ***, aber ich denke, ich muss meine eigene Antwort als beantwortet jetzt beantworten. Vielen Dank für Ihre Geduld und Hilfe @Nikolay Elenkov! – slinden77

+0

Ist "thisclassname" eine tatsächliche Klasse? –

4

Sie versuchen, effektiv eine private API verwenden - den Klassennamen der Aktivität Google-Konto hinzufügen können sich ändern, oder es kann schon anders auf verschiedenen Android-Versionen sein. Es befindet sich in einem der Google-Dienstepakete und Sie sollten seinen Namen natürlich nicht zu Ihrem Manifest hinzufügen. Kurz gesagt, das ist ein Hack, tu es nicht. Funktioniert AccountManager.addAcount("com.google",...) nicht für Sie (Sie benötigen die Berechtigung MANAGE_ACCOUNTS)?

+0

Ich weiß, du hast Recht, aber ich bevorzuge immer noch meinen Weg. Ich habe versucht, die addAccount-Methode, aber ehrlich gesagt, es hat einfach nicht für mich funktioniert. Abgesehen davon erfordert dies eine zusätzliche Erlaubnis, die für mich sinnlos erscheint. Ich kann diese Berechtigung für die addAccountExplicitely-Methode verstehen, da dies im Hintergrund ein Konto hinzufügt, aber alle addAccount-Funktionen eine neue Aktivität aufrufen, die eigene Arbeit verarbeitet, nichts wird tatsächlich von der Anwendung selbst verwaltet/geändert/erstellt. Aber nehmen wir an, ich ändere meine Meinung, könnten Sie ein Beispiel schreiben, das funktionieren sollte? Ich habe es versucht, mit com.google Typ und Ruhe Null, hat nicht funktioniert – slinden77

+0

Ich sehe Ihren Punkt, aber Sie sind eigentlich _Adding_ ein Konto, wenn auch mit Benutzerinteraktion, so macht es irgendwie sinnvoll.Ich weiß aber, dass es einige Nutzer abschrecken könnte. Ich werde es überprüfen müssen, aber IIRC, solange Sie die Erlaubnis haben, "com.google" und der Rest "null" sollte funktionieren. Welchen Fehler bekommst du? –

+0

Sie haben recht, auf der Android-Entwickler-Website wird eindeutig angegeben, dass Berechtigungen zum Starten neuer Aktivitäten erforderlich sind. Ich habe mein Problem irgendwie umgangen, indem ich intent.setClassName (com.google.android.gsf, ...) in (com.google.android.gsf.login) geändert habe. Mein Hinweis war in der Konsole, wo ich versuchte herauszufinden, was geschah, als ich den zusätzlichen Schritt, die globale Add-Account-Seite, nutzte. Jetzt habe ich ein neues Problem, es fragt mich nach einem Passwort und zeigt sofort einen Fehler an, wenn ich nicht mit Google-Servern kommunizieren kann. Ich bekomme keine Fehler, wenn ich die addAccount-Methode verwende ... aber es funktioniert immer noch nicht ... thx! – slinden77