Доступ к учетной записи на YouTube с помощью аккаунт-менеджера

Я пытаюсь получить доступ к учетной записи YouTube с помощью диспетчера учетных записей, что означает, что я хочу получить доступ к YouTube с помощью учетной записи, связанной с моим устройством, и с этим получить токен YouTube для доступа к плейлисту пользователя и так далее. Приложение Freedi для Android делает что-то подобное.

Я использовал этот код для получения токена

    am.getAuthToken(accounts[0], "youtube", true, new AccountManagerCallback<Bundle>() {

        @Override
        public void run(AccountManagerFuture<Bundle> future) {
            try {
                Bundle bundle = future.getResult();
                if (bundle.containsKey(AccountManager.KEY_INTENT)) {
                    Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
                    intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivityForResult(intent, 0);
                } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
                    my_access_token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
                    onActivityResult(0,1,null);
                }
            } catch (Exception e) {
                Log.e("TEST", e.getMessage(), e);
            }
        }
    }, null);

но переменная my_access_token заполнена токеном, который YouTube не может распознать... как я могу получить из него токен YouTube? а как получить плейлист пользователя?

3 ответа

Решение

Вам повезло, так как я только что закончил решение этой проблемы в приложении, которое я разрабатываю.

AccountManager.get(getApplicationContext()).getAuthTokenByFeatures("com.google", "oauth2:https://gdata.youtube.com", null, this,
    null, null, new AccountManagerCallback<Bundle>() {

        @Override
        public void run(AccountManagerFuture<Bundle> future) {
        try {
            Bundle bundle = future.getResult();
            String acc_name = bundle.getString(AccountManager.KEY_ACCOUNT_NAME);
            String auth_token = bundle.getString(AccountManager.KEY_AUTHTOKEN);

            Log.d(DEBUG_TAG, "name: " + acc_name + "; token: " + auth_token);

        } catch (Exception e) {
            Log.e(DEBUG_TAG, e.getClass().getSimpleName() + ": " + e.getMessage());
        }
        }
    }, null);

Я еще не использовал его в приложении, и оно может быть доступно не на всех устройствах Android, но, насколько я понимаю, сервисы Google Play в настоящее время обеспечивают лучший подход к получению токенов OAuth 2 (включая те, которые доступны для https://gdata.youtube.com/). Там больше информации на

http://android-developers.blogspot.com/2012/09/google-play-services-and-oauth-identity.html

Вы можете использовать подход AccountManager для большей совместимости.

Запутывающей частью является параметр authTokenType, он должен быть в комплекте со спецификацией для доступа OAuth2, например

"oauth2: https://gdata.youtube.com/"

или же

"oauth2: https://www.googleapis.com/auth/tasks"

Другие вопросы по тегам