2015-12-22 19 views
5

Ich habe eine Weile nach einer Lösung für dieses Problem gesucht (Tage, keine Minuten), aber es entzieht sich mir ziemlich effektiv.Ein Google-Konto programmgesteuert auf Android-Gerät registrieren

Bitte beachten Sie, dass dies keine Frage zum Starten der Registrierungsprozedur ist. Dies muss automatisch ohne Benutzerinteraktion geschehen.

Ich möchte meinem benutzerdefinierten Gerät (1000 von ihnen) ein Google-Konto hinzufügen. Das Konto wird hauptsächlich dazu verwendet, den Google Play Store auf dem Gerät zu aktivieren, damit die App aktualisiert werden kann, wenn neuere Versionen verfügbar sind.

Mein vorhandener Code (der kürzeste Schnipsel von denen ich versuchte):

AccountManager mgr = AccountManager.get(this); 
Account acc = new Account("[email protected]", "com.google"); 
mgr.addAccountExplicitly(acc, "password", new Bundle())); 

ergibt natürlich ein

java.lang.SecurityException: caller uid 10047 is different than the authenticator's uid 

So wie würde ich dies tatsächlich zu erreichen gehe über? Mein Gerät ist verwurzelt, so dass es kein Hindernis ist, wenn es der einzige Weg ist.

+0

Soweit mir bekannt ist, können Sie kein Konto für einen anderen Apps-Authentifikator erstellen. Wenn Sie über die Firmware und den Signaturschlüssel verfügen, können Sie Ihre Benutzer-ID möglicherweise mit der Systembenutzer-ID teilen. In diesem Fall können Sie es möglicherweise umgehen. (nicht schriftlich als Antwort, da ich nicht 100% sicher über diese Informationen bin) – Knossos

+0

Nun, Titan Backup kann es tun, so muss ot irgendwie machbar sein – velis

+2

Da dies ist Ihr benutzerdefiniertes Gerät, und Sie behaupten, den "Google Play Store" Sie müssen es von Google lizenziert haben. Sie sollten Google fragen, welche Richtlinien für die Einrichtung von Google-Konten in diesen Situationen gelten, und nicht nur, um festzustellen, wie es am besten funktioniert, sondern auch, ob es überhaupt autorisiert ist. – CommonsWare

Antwort

0

Nun, wie sich herausstellt, ist dies nicht leicht zu lösen. Ich habe am Ende ein Gerät registriert und dann die Benutzerdatei daraus gezogen. Speicherort der Benutzerdatei: /data/system/users/0/accounts.db (Wenn auf dem Gerät mehrere Benutzerprofile vorhanden sind, kann das letzte Verzeichnis je nach Profil unterschiedlich sein).

Ich speicherte diese Datei in den App-Assets (gezippt, stellen Sie sicher, dass die Erweiterung nicht something.gz ist, weil das während des Verpackens verloren geht - nicht gestört, warum).

Zuerst habe ich überprüfen, ob mein Benutzer bereits vorhanden ist:

AccountManager mgr = AccountManager.get(this); 
for (Account acc: mgr.getAccountsByType("com.google")) { 
    if (acc.name.equalsIgnoreCase("[email protected]")) 
    return; 
} 

Ist dies der Fall, überspringe ich nur den Schritt. Ansonsten entpacke ich die Benutzerdatei und überschreibe die vorhandene Datei (mit su). Ich mache dann auch einen Neustart, um sicherzustellen, dass Änderungen registriert sind.

+0

Haben Sie einen besseren Weg gefunden, das zu tun? Dies setzt voraus, dass Sie dieses Benutzerkonto einmal manuell registriert haben, damit die Datei accounts.db mit der E-Mail und dem Hash des Kennworts gefüllt wird. Gibt es eine Möglichkeit, dies zu tun, überspringen Sie den ersten Schritt, wenn Sie nur das rohe Passwort kennen und keine Ahnung von seiner Hash-Form haben. Außerdem bin ich mir nicht sicher, ob die Hash-Form des Passworts für alle Geräte gleich ist, selbst wenn das Modell solcher Geräte genau gleich ist. –

+0

@ThanasisPetsas: Eigentlich nein.Wie sich herausstellt, hat Google eine Erkennung eingerichtet. Sobald 50 Geräte mit demselben Konto verwendet wurden, funktionierte der Play Store nicht mehr. Also mussten wir unseren eigenen Paket-Update-Mechanismus implementieren. – velis

+0

Ok, gut zu wissen! Also, die 49 Geräte waren in Ordnung mit einem Konto? Die Hash-Form des Passwortes war für alle Geräte gleich? –

0

Es ist nicht möglich, ein Google-Konto mit addAccountExplicitly() hinzuzufügen/zu erstellen. Sie können nur Konten für Ihre eigenen Dienste hinzufügen. Sogar Ihr Gerät ist verwurzelt, da es vom Google-Webserver abgelehnt wird. Für mehr Details überprüfen Sie diese link