在 Android 中使用 YoutubePlayerView 集成 Youtube 频道





5.00/5 (2投票s)
在 Android 中集成 Youtube 频道的 Android 教程。
引言
YouTube 是一个分享和观看视频的绝佳平台。在这篇文章中,我们将学习如何在 Android 应用中集成 YouTube 频道。我们将使用 YouTube Android Player API 在 YoutubePlayerView 中显示视频。现在我们将逐步完成本教程,并将 YouTube 频道集成到 Android 中。
步骤
1. 查找 YouTube 频道 ID:转到任何 YouTube 频道的首页,并复制该频道的 URL。例如,如果我们复制纳伦德拉·莫迪频道的 URL,则 URL 将如下所示。channel/之后的最后一个单词就是频道 ID。
URL: https://www.youtube.com/channel/UC1NF71EwP41VdjAU1iXdLkw
频道 ID:UC1NF71EwP41VdjAU1iXdLkw
2. 生成 SHA1 密钥:在 Google 开发者控制台中注册 YouTube Player API 时,您需要生成 SHA1 密钥。为此,请按照以下步骤操作。
- 转到您的 Android 项目,然后单击 Gradle 图标。
- 单击YourProjectName(root),如果没有任何内容显示,请单击刷新图标。
- 现在转到Tasks -> android -> signingReport。您将找到 SHA1 密钥。
3. 获取 YouTube Data API v3 的 API 密钥:转到 Google 开发者控制台 并单击选择项目,您可以选择现有项目或为 YouTube 集成创建新项目。
3.2 搜索 YouTube Data API v3,选择此 API 并启用它。现在您将导航到项目仪表板。
3.3 单击“凭据”,现在创建凭据并复制您的 API 密钥并保存它。您可以通过根据您的使用情况选择来限制密钥,然后粘贴我们在步骤 2 中生成的 SHA1 密钥并保存它。我们选择“无”,但是始终建议使用限制。
4. 获取 JSON 格式的频道视频列表:现在转到 YouTube Data API 文档 并向下滚动,您将找到授权并执行按钮,为简单起见,我们在在 APIs 资源管理器中加载中执行数据,然后我们导航到另一个页面。
4.2 有许多参数,但只有part参数是必需的,现在在channelId文本字段中输入我们在第一步中获得的频道 ID。单击授权并执行按钮,我们将获得频道的视频列表和描述(JSON 格式)。复制我们从 GET 请求中获得的 URL。您也可以在浏览器中运行此 URL,方法是用您的 API 密钥替换{YOUR_API_KEY}。
Android 集成部分
我们将使用 Volley 库来解析 JSON 数据并将其填充到列表视图中。我们必须将其添加到 App 的 *build.gradle* 文件中。
compile 'com.mcxiaoke.volley:library:1.0.19'
现在我们需要在 Android Studio 项目中添加 YoutubeAndroidPlayerApi.jar。
下载 *YoutubeAndroidPlayerApi.jar* 文件,并将其复制到 Android 项目的 libs 文件夹中。如果该文件夹不存在,请创建一个 libs 文件夹。
5. 创建 ChannelActivity 活动:我将其命名为 activity_channel。在此活动中,我们使用 ListView 在列表中显示 YouTube 视频。此文件的 XML 代码如下所示。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="<a href="http://schemas.android.com/apk/res/android" rel="nofollow">http://schemas.android.com/apk/res/android</a>"
xmlns:app="<a href="http://schemas.android.com/apk/res-auto" rel="nofollow">http://schemas.android.com/apk/res-auto</a>"
xmlns:tools="<a href="http://schemas.android.com/tools" rel="nofollow">http://schemas.android.com/tools</a>"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/youtube_fragment"
tools:context="com.techiesatish.youtubeintegration.ChannelActivity">
<ListView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/videoList">
</ListView>
</LinearLayout>
5.2 ChannelActivity.java:我们正在解析 JSON 数据并使用自定义适配器将数据提供给 ListView。也许,由于没有获得类,您会遇到一些错误,只需忽略这些错误并按照其他步骤创建类。
package com.techiesatish.youtubeintegration; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ListView; import com.android.volley.DefaultRetryPolicy; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.RetryPolicy; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; public class ChannelActivity extends AppCompatActivity { ListView lvVideo; ArrayList<VideoDetails> videoDetailsArrayList; CustomListAdapter customListAdapter; String searchName; String TAG="ChannelActivity"; String URL="https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=UC9CYT9gSNLevX5ey2_6CK0Q&maxResults=25&key={Your API KEI}"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_channel); lvVideo=(ListView)findViewById(R.id.videoList); videoDetailsArrayList=new ArrayList<>(); customListAdapter=new CustomListAdapter(ChannelActivity.this,videoDetailsArrayList); showVideo(); } private void showVideo() { RequestQueue requestQueue= Volley.newRequestQueue(getApplicationContext()); StringRequest stringRequest=new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject=new JSONObject(response); JSONArray jsonArray=jsonObject.getJSONArray("items"); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject1 = jsonArray.getJSONObject(i); JSONObject jsonVideoId=jsonObject1.getJSONObject("id"); JSONObject jsonsnippet= jsonObject1.getJSONObject("snippet"); JSONObject jsonObjectdefault = jsonsnippet.getJSONObject("thumbnails").getJSONObject("medium"); VideoDetails videoDetails=new VideoDetails(); String videoid=jsonVideoId.getString("videoId"); Log.e(TAG," New Video Id" +videoid); videoDetails.setURL(jsonObjectdefault.getString("url")); videoDetails.setVideoName(jsonsnippet.getString("title")); videoDetails.setVideoDesc(jsonsnippet.getString("description")); videoDetails.setVideoId(videoid); videoDetailsArrayList.add(videoDetails); } lvVideo.setAdapter(customListAdapter); customListAdapter.notifyDataSetChanged(); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }); int socketTimeout = 30000; RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); stringRequest.setRetryPolicy(policy); requestQueue.add(stringRequest); } }
6. 创建 CustomListAdapter 类:此类扩展 BaseAdapter 并将数据填充到 ListView 中。代码如下所示。
package com.techiesatish.youtubeintegration;
import android.support.v4.app.FragmentManager;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import java.util.ArrayList;
public class CustomListAdapter extends BaseAdapter {
Activity activity;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
private LayoutInflater inflater;
ArrayList<VideoDetails> singletons;
public CustomListAdapter(Activity activity, ArrayList<VideoDetails> singletons) {
this.activity = activity;
this.singletons = singletons;
}
public int getCount() {
return this.singletons.size();
}
public Object getItem(int i) {
return this.singletons.get(i);
}
public long getItemId(int i) {
return (long) i;
}
public View getView(int i, View convertView, ViewGroup viewGroup) {
if (this.inflater == null) {
this.inflater = (LayoutInflater) this.activity.getLayoutInflater();
// getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
if (convertView == null) {
convertView = this.inflater.inflate(R.layout.videolist, null);
}
if (this.imageLoader == null) {
this.imageLoader = AppController.getInstance().getImageLoader();
}
NetworkImageView networkImageView = (NetworkImageView) convertView.findViewById(R.id.video_image);
final TextView imgtitle = (TextView) convertView.findViewById(R.id.video_title);
final TextView imgdesc = (TextView) convertView.findViewById(R.id.video_descriptio);
final TextView tvURL=(TextView)convertView.findViewById(R.id.tv_url);
final TextView tvVideoID=(TextView)convertView.findViewById(R.id.tv_videoId);
((LinearLayout) convertView.findViewById(R.id.asser)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(view.getContext(), VideoActivity.class);
intent.putExtra("videoId",tvVideoID.getText().toString());
view.getContext().startActivity(intent);
}
});
VideoDetails singleton = (VideoDetails) this.singletons.get(i);
networkImageView.setImageUrl(singleton.getURL(), this.imageLoader);
tvVideoID.setText(singleton.getVideoId());
imgtitle.setText(singleton.getVideoName());
imgdesc.setText(singleton.getVideoDesc());
return convertView;
}
}
7. 创建 AppController 类:在此类中,我们正在创建一个扩展 Application 的AppController
类。我们还需要在 AndroidManifest 文件中定义它。
package com.techiesatish.youtubeintegration;
import android.app.Application;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private static AppController mInstance;
private ImageLoader mImageLoader;
private RequestQueue mRequestQueue;
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
AppController appController;
synchronized (AppController.class) {
appController = mInstance;
}
return appController;
}
public RequestQueue getRequestQueue() {
if (this.mRequestQueue == null) {
this.mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return this.mRequestQueue;
}
public ImageLoader getImageLoader() {
getRequestQueue();
if (this.mImageLoader == null) {
this.mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache());
}
return this.mImageLoader;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
if (TextUtils.isEmpty(tag)) {
tag = TAG;
}
req.setTag(tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (this.mRequestQueue != null) {
this.mRequestQueue.cancelAll(tag);
}
}
}
8. 创建 LruBitmapCache 类:通过使用 Volley 库,图像的下载和缓存非常简单。此类的代码如下所示。
package com.techiesatish.youtubeintegration;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
public class LruBitmapCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
public static int getDefaultLruCacheSize() {
return ((int) (Runtime.getRuntime().maxMemory() / 1024)) / 8;
}
public LruBitmapCache() {
this(getDefaultLruCacheSize());
}
public LruBitmapCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
protected int sizeOf(String key, Bitmap value) {
return (value.getRowBytes() * value.getHeight()) / 1024;
}
public Bitmap getBitmap(String url) {
return (Bitmap) get(url);
}
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
9. 创建 VideoDetails 类:在此类中,我们使用 setter 和 getter 方法来更新和检索视频的值。
package com.techiesatish.youtubeintegration;
public class VideoDetails {
String VideoName;
String VideoDesc;
String URL;
String VideoId;
public void setVideoName(String VideoName){
this.VideoName=VideoName;
}
public String getVideoName(){
return VideoName;
}
public void setVideoDesc(String VideoDesc){
this.VideoDesc=VideoDesc;
}
public String getVideoDesc(){
return VideoDesc;
}
public void setURL(String URL){
this.URL=URL;
}
public String getURL(){
return URL;
}
public void setVideoId(String VideoId){
this.VideoId=VideoId;
}
public String getVideoId(){
return VideoId;
}
}
10. 创建 VideoActivity:我们将创建一个活动来显示 YouTube 视频,我们使用YoutubePlayerView来显示视频。这是我们的活动 XML 文件。
<LinearLayout xmlns:android="<a href="http://schemas.android.com/apk/res/android" rel="nofollow">http://schemas.android.com/apk/res/android</a>"
xmlns:app="<a href="http://schemas.android.com/apk/res-auto" rel="nofollow">http://schemas.android.com/apk/res-auto</a>"
xmlns:tools="<a href="http://schemas.android.com/tools" rel="nofollow">http://schemas.android.com/tools</a>"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.techiesatish.youtubeintegration.VideoActivity">
<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtubeview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
10.2 VideoActivity.java:此活动扩展 YouTubeBaseActivity。在此活动中,我们从 ChannelActivity 获取视频 ID 并使用curVideo()
方法显示视频。
package com.techiesatish.youtubeintegration;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.widget.Toast;
import com.google.android.youtube.player.YouTubeBaseActivity;
import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerView;
public class VideoActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {
YouTubePlayerView youTubePlayerView;
String API_KEY="Your API Key";
private static final int RECOVERY_REQUEST = 1;
String TAG="VideoActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
youTubePlayerView=(YouTubePlayerView)findViewById(R.id.youtubeview);
youTubePlayerView.initialize(API_KEY, this);
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
Bundle bundle = getIntent().getExtras();
String showVideo = bundle.getString("videoId");
Log.e(TAG,"Video" +showVideo);
youTubePlayer.cueVideo(showVideo);
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
if (youTubeInitializationResult.isUserRecoverableError()) {
youTubeInitializationResult.getErrorDialog(this, RECOVERY_REQUEST).show();
} else {
Toast.makeText(this, "Error Intializing Youtube Player", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RECOVERY_REQUEST) {
getYouTubePlayerProvider().initialize(API_KEY, this);
}
}
protected YouTubePlayer.Provider getYouTubePlayerProvider() {
return youTubePlayerView;
}
}
11. 现在添加互联网权限并在清单文件中定义AppController
。
<manifest xmlns:android="<a href="http://schemas.android.com/apk/res/android" rel="nofollow">http://schemas.android.com/apk/res/android</a>"
package="com.techiesatish.youtubeintegration">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".AppController"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ChannelActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".VideoActivity">
</activity>
</application>
</manifest>
现在运行此应用程序并享受吧!!!如果您遇到任何问题,请在评论框中告诉我。我很乐意帮助您。您可以从 Github 下载此代码。您还可以查看其他有用的教程。
演示:YouTube 上的演示