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