65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Android 中使用 YoutubePlayerView 集成 Youtube 频道

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2017 年 11 月 13 日

CPOL

4分钟阅读

viewsIcon

33935

在 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 密钥。为此,请按照以下步骤操作。

  1. 转到您的 Android 项目,然后单击 Gradle 图标。
  2. 单击YourProjectName(root),如果没有任何内容显示,请单击刷新图标。
  3. 现在转到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 开发者文档

演示:YouTube 上的演示

© . All rights reserved.