Получить все типы аккаунтов Android API 29 - PullRequest
0 голосов
/ 01 октября 2019

Я новичок в android и пытаюсь получить список учетных записей, которые пользователь android зарегистрировал на своем устройстве. Я использовал менеджер аккаунтов Android, чтобы сделать это следующим образом:

public static int count;
count=0;
JSONArray jsonArr = new JSONArray();
JSONObject emailObj = new JSONObject();
Account[] accounts = AccountManager.get(mContext).getAccounts();
        //Account[] accounts = AccountManager.get(mContext).getAccountsByType(null);
        for (Account account : accounts) {
            //possibleEmail += " "+account.name+" : "+account.type+" \n";

            JSONObject elem = new JSONObject();
            elem.put("name", account.name);
            elem.put("type", account.type);
            jsonArr.put(elem);
            //possibleEmail += " "+account.name+" \n";
            count++;
            emailObj.put("list",jsonArr);

        }

Приведенный выше код работает, например, как требуется для API уровня 23, например. Я получаю список учетных записей следующим образом:

[{"name":"agmailaccount@gmail.com","type":"com.google"},{"name":"agmailaccount2@gmail.com","type":"com.google"},{"name":"agmailaccount3@gmail.com","type":"com.google"},{"name":"handler","type":"com.twitter.android.auth.login"},{"name":"Facebook","type":"com.facebook.auth.login"},{"name":"LinkedIn","type":"com.linkedin.android"}]

Обратите внимание, что я могу определить, вошел ли пользователь в сторонние приложения. У меня действительно установлены linkedin, fb и twitter, и я захожу на эти платформы со своего устройства. Мне просто нужно захватить это (как показано в списке выше), а не реальные имена учетных записей.

Дело в том, что когда я использую тот же код для Android API уровня 29, он не возвращает сторонние учетные записикак com.twitter.android.auth.login, com.facebook.auth.login и "com.linkedin.android. Тем не менее, я могу видеть учетные записи Gmail, вошедшие в систему на устройстве. Как я могу получить эту информацию в последних версиях Android?

Я также должен сказать, что я использую новейший API 29 из эмулятора Android и не знаю, является ли это причиной. Я установил linkedin, twitter и fb в эмуляторе и вошел в систему.

Мне просто нужно получить тот же результат, что показан выше, но для новых версий Android.

1 Ответ

2 голосов
/ 01 октября 2019

Как правило, нет, вы не можете получить программный доступ к учетным записям других приложений на более новых устройствах.

Согласно Изменения поведения API 26 :

В Android 8.0 (уровень API 26) приложения больше не могут получать доступ к учетным записям пользователей, если только аутентификатор не владеет учетными записями или пользователь не предоставляет такой доступ. Разрешение GET_ACCOUNTS больше не является достаточным. Чтобы получить доступ к учетной записи, приложения должны использовать AccountManager.newChooseAccountIntent() или метод проверки подлинности. После получения доступа к учетным записям, приложение может позвонить AccountManager.getAccounts(), чтобы получить к ним доступ.

Поэтому вам следует специально попросить пользователя выбрать учетную запись с помощью newChooseAccountIntent() (API доступен обратно для API 14), чтобы пользователь мог предоставить вам доступ именно к той учетной записи, которую он хочет сделать доступной для вашего приложения.

Как уже упоминалось на той же странице, есть новых API AccountManager, которые позволяют определенным приложениям, имеющим учетную запись, контролировать, скрывать ли или открывать учетные записи для любого другого приложения. Это может объяснить, почему у вас есть доступ к некоторому подмножеству того, что вы могли получить раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...