Я искал решение этой проблемы какое-то время (дни, а не минуты), но это ускользает от меня довольно эффективно.
Обратите внимание, что это НЕ вопрос о начале процедуры регистрации. Это должно происходить автоматически без какого-либо взаимодействия с пользователем.
Я хотел бы добавить аккаунт Google на свое пользовательское устройство (1000 из них). Аккаунт будет использоваться главным образом для активации магазина Google Play на устройстве, чтобы приложение могло обновляться, когда доступны новые версии.
Мой существующий код (самый короткий фрагмент из тех, что я пробовал):
AccountManager mgr = AccountManager.get(this); Account acc = new Account("email@gmail.com", "com.google"); mgr.addAccountExplicitly(acc, "password", new Bundle()));
Естественно, дает
java.lang.SecurityException: caller uid 10047 is different than the authenticator's uid
Так как же я могу это сделать? Мое устройство укоренено так, что это не препятствие, если это единственный способ.
Ну, как оказалось, это не так легко решить. Я закончил регистрацию одного устройства, а затем вытащил из него файл пользователей. Расположение файла users: /data/system/users/0/accounts.db
(если на устройстве имеется несколько профилей пользователей, последний каталог может отличаться в зависимости от профиля).
Я сохранил этот файл в активах моего приложения (gzipped, убедитесь, что расширение не является чем-то.gz, потому что оно потерялось во время упаковки – не потрудилось проверить, почему).
Сначала я проверяю, существует ли мой пользователь:
AccountManager mgr = AccountManager.get(this); for (Account acc: mgr.getAccountsByType("com.google")) { if (acc.name.equalsIgnoreCase("email@gmail.com")) return; }
Если это произойдет, я просто пропущу шаг. В противном случае я распакую файл пользователя и перезаписываю существующий (используя su
). Затем я также перезагружаюсь, чтобы убедиться, что изменения зарегистрированы.
Невозможно добавить / создать учетную запись Google, используя addAccountExplicitly (). Вы можете добавлять аккаунты только для своих собственных услуг. Даже ваше устройство внедрено, потому что оно будет отклонено веб-сервером Google. Подробнее см. Ссылку