【问题标题】:How to extract all video thumbnails from a playlist using youtube api in android?如何在android中使用youtube api从播放列表中提取所有视频缩略图?
【发布时间】:2018-06-20 03:40:43
【问题描述】:

让我们看下面的例子。

在这里我可以在 imageView 中看到 youTubeThumbnailView1 的缩略图。

我在代码中包含了一些问题作为 cmets 的一部分。

一开始我以为我可以创建一个 ImageView 的 ArrayList 并在其中获取所有缩略图,但这不起作用,因为我什至无法访问该方法之外的 imageView。

感谢任何帮助。

public class MainActivity extends YouTubeBaseActivity implements YouTubeThumbnailView.OnInitializedListener {

    private YouTubeThumbnailView youTubeThumbnailView1;
    //private YouTubeThumbnailLoader youTubeThumbnailLoader;
    private ImageView imageView;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            youTubeThumbnailView1 = (YouTubeThumbnailView) findViewById(R.id.youtubeThumbnailView1);
            imageView = (ImageView) findViewById(R.id.imageView);
            youTubeThumbnailView1.initialize(DeveloperKey.DEVELOPER_KEY, this);

            //Accessing imageView here would give NullPointerException
        }

    @Override
        public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader youTubeThumbnailLoader) {

        //this.youTubeThumbnailLoader = youTubeThumbnailLoader; for calling next() etc. in onThumbnailLoader(,)

        youTubeThumbnailLoader.setOnThumbnailLoadedListener(new ThumbnailListener());
        youTubeThumbnailLoader.setPlaylist("ECAE6B03CA849AD332",1);

        //How to call release() on the youTubeThumbnailLoader parameter as it causes ServiceConnectionLeaked after exiting the app. But if you call it here nothing works.
        }

    @Override
        public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, YouTubeInitializationResult youTubeInitializationResult) {
    }

    private class ThumbnailListener implements YouTubeThumbnailLoader.OnThumbnailLoadedListener{

            @Override
            public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
                imageView.setImageDrawable(youTubeThumbnailView.getDrawable());

            /*How can i access this imageView outside of this method?
              Using something like below will show all the thumbnails BUT how do you access them outside of this method?

            if (youTubeThumbnailLoader.hasNext()) {
               youTubeThumbnailLoader.next();
            } else {
              youTubeThumbnailLoader.first();
            }
            */

            }

            @Override
            public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader.ErrorReason errorReason) {
            }
        }
    }

【问题讨论】:

    标签: java android youtube-api clone android-youtube-api


    【解决方案1】:

    我最近设法在名为 picasso 的库的帮助下将图像加载到 imageview 和 android async http 以检索缩略图列表。 将此添加到依赖项下的应用级 build.gradle 文件中。

    dependencies {
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.loopj.android:android-async-http:1.4.9'
    }
    

    为了检索图像,我向 Youtube 数据 API 发出了一个 http get 请求,并检索了所有图像 URL 并将其添加为 Video 类的缩略图属性。 有关检索所有缩略图的更多信息:https://developers.google.com/youtube/v3/docs/playlistItems/list

    我是这样做的。

     private void loadVideos(String id) {
        //just a method to check if i am connected to the internet
        checkConnected();
        String requestUrl = "https://www.googleapis.com/youtube/v3/playlistItems";
        String key = API_KEY;
        String param = "?part=id, snippet&playlistId=" + id + "&key=" + key + "&maxResults=50";
        String request = requestUrl + param;
    
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        client.get(request, params, new TextHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
    
            }
    
            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                try {
                    videoArr = new ArrayList<Video>();
                    JSONObject obj = new JSONObject(responseString);
                    JSONArray playlistItems = obj.getJSONArray("items");
                    for (int i = 0; i < playlistItems.length(); i++) {
                        JSONObject snippet = playlistItems.getJSONObject(i).getJSONObject("snippet");
                        String title = snippet.getString("title");
                        String description = snippet.getString("description");
    
                        JSONObject thumbnailObj = snippet.getJSONObject("thumbnails");
                        //Here i am extracting the URL of the thumbnail
                        String thumbnail = thumbnailObj.getJSONObject("high").getString("url");
    
                        JSONObject resourceId = snippet.getJSONObject("resourceId");
                        String id = resourceId.getString("videoId");
    
                        Video video = new Video(id, title, description, thumbnail);
                        videoArr.add(video);
                    }
                    populateListView(videoArr);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    

    我的视频类如下:

    public class Video implements Serializable {
        private String id;
        private String title;
        private String description;
        private String thumbnail;
    
        public Video(String id, String title, String description, String thumbnail) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.thumbnail = thumbnail;
        }
    
        public String getId() {
            return id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public String getDescription() {
            return description;
        }
    
        public String getThumbnail() {
            return thumbnail;
        }
    }
    

    最后,为了加载图像,我使用毕加索这样做了。

    ImageView yourImageView = (ImageView)findViewById(R.id.yourImageView);
    
    //video is my Video object.
    Picasso.with(yourActivity.this).load(video.getThumbnail()).fit().into(yourImageView);
    

    别忘了你必须从开发者控制台获取 API 密钥。希望我能帮上忙。祝你的应用好运!

    【讨论】:

    • 感谢您的回复,我一定会尝试您的方法。但我很想知道是否可以在无需明确处理 JSON 和 HTTP 并且仅使用 youtube 提供的 youtube-android-api 的情况下获取这些缩略图。
    • 它只给出前50个结果,如何使用下一页令牌来获取接下来的50个视频?
    猜你喜欢
    • 2012-11-01
    • 2018-09-01
    • 2015-08-20
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多