在 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);
    }
}