在 Android 上使用 YouTube Data API

此示例将指导你如何使用 Android 上的 YouTube 数据 API 获取播放列表数据。

SHA-1 指纹

首先,你需要为你的机器获取 SHA-1 指纹。有各种方法可以检索它。你可以选择本问答中提供的任何方法。

适用于 Android 的 Google API 控制台和 YouTube 密钥

现在你已拥有 SHA-1 指纹,请打开 Goog​​le API 控制台并创建项目。转到此页面并使用该 SHA-1 密钥创建项目并启用 YouTube Data API。现在你将获得一把键。此密钥将用于从 Android 发送请求并获取数据。

Gradle 部分

你必须将以下行添加到 YouTube Data API 的 Gradle 文件中:

compile 'com.google.apis:google-api-services-youtube:v3-rev183-1.22.0'

要使用 YouTube 的原生客户端发送请求,我们必须在 Gradle 中添加以下行:

compile 'com.google.http-client:google-http-client-android:+'
compile 'com.google.api-client:google-api-client-android:+'
compile 'com.google.api-client:google-api-client-gson:+'

还需要在 Gradle 中添加以下配置以避免冲突:

configurations.all {
    resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.2'
} 

下面显示了 gradle.build 最终的样子。

build.gradle

apply plugin: 'com.android.application'
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.aam.skillschool"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    configurations.all {
        resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.2'
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.google.apis:google-api-services-youtube:v3-rev183-1.22.0'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'com.google.http-client:google-http-client-android:+'
    compile 'com.google.api-client:google-api-client-android:+'
    compile 'com.google.api-client:google-api-client-gson:+'
}

现在是 Java 部分。由于我们将使用 HttpTransport 进行网络连接而将 GsonFactory 用于将 JSON 转换为 POJO,因此我们不需要任何其他库来发送任何请求。

现在,我想通过提供播放列表 ID 来展示如何通过 YouTube API 获取播放列表。对于这个任务,我将使用 AsyncTask。要了解我们如何请求参数并了解流程,请查看 YouTube 数据 API

public class GetPlaylistDataAsyncTask extends AsyncTask<String[], Void, PlaylistListResponse> {
    private static final String YOUTUBE_PLAYLIST_PART = "snippet";
    private static final String YOUTUBE_PLAYLIST_FIELDS = "items(id,snippet(title))";

    private YouTube mYouTubeDataApi;

    public GetPlaylistDataAsyncTask(YouTube api) {
        mYouTubeDataApi = api;
    }

    @Override
    protected PlaylistListResponse doInBackground(String[]... params) {

        final String[] playlistIds = params[0];

        PlaylistListResponse playlistListResponse;
        try {
            playlistListResponse = mYouTubeDataApi.playlists()
                    .list(YOUTUBE_PLAYLIST_PART)
                    .setId(TextUtils.join(",", playlistIds))
                    .setFields(YOUTUBE_PLAYLIST_FIELDS)
                    .setKey(AppConstants.YOUTUBE_KEY) //Here you will have to provide the keys
                    .execute();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        return playlistListResponse;
    }
}

上面的异步任务将返回 PlaylistListResponse 的一个实例,它是 YouTube SDK 的内置类。它具有所有必需的字段,因此我们不必自己创建 POJO。

最后,在我们的 MainActivity 中,我们将不得不做以下事情:

public class MainActivity extends AppCompatActivity {
    private YouTube mYoutubeDataApi;
    private final GsonFactory mJsonFactory = new GsonFactory();
    private final HttpTransport mTransport = AndroidHttp.newCompatibleTransport();
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_review);
        mYoutubeDataApi = new YouTube.Builder(mTransport, mJsonFactory, null)
                .setApplicationName(getResources().getString(R.string.app_name))
                .build();
        String[] ids = {"some playlists ids here seperated by "," };
        new GetPlaylistDataAsyncTask(mYoutubeDataApi) {
            ProgressDialog progressDialog = new ProgressDialog(getActivity());

            @Override
            protected void onPreExecute() {
                progressDialog.setTitle("Please wait.....");
                progressDialog.show();
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(PlaylistListResponse playlistListResponse) {
                super.onPostExecute(playlistListResponse);
                //Here we get the playlist data
                progressDialog.dismiss();
                Log.d(TAG, playlistListResponse.toString());
            }
        }.execute(ids);
    }
}