在 Android 上使用 YouTube Data API
此示例將指導你如何使用 Android 上的 YouTube 資料 API 獲取播放列表資料。
SHA-1 指紋
首先,你需要為你的機器獲取 SHA-1 指紋。有各種方法可以檢索它。你可以選擇本問答中提供的任何方法。
適用於 Android 的 Google API 控制檯和 YouTube 金鑰
現在你已擁有 SHA-1 指紋,請開啟 Google 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);
}
}