单击特定项目时如何在同一ListView中播放视频

时间:2016-06-10 10:02:20

标签: android android-studio video

我有ListView,它包含多个视频。我想在点击特定视频时播放视频,并且当用户在同一个ListView上点击另一个视频时停止而不调用任何其他活动,我试过但是崩溃应用程序

E/ActivityThread: Activity example.com.videolistplaydemo.PlayVideoApi has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@41b20708 that was originally bound here
                                                                             android.app.ServiceConnectionLeaked: Activity example.com.videolistplaydemo.PlayVideoApi has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@41b20708 that was originally bound here
                                                                                 at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:974)
                                                                                 at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:868)
                                                                                 at android.app.ContextImpl.bindService(ContextImpl.java:1762)
                                                                                 at android.app.ContextImpl.bindService(ContextImpl.java:1751)
                                                                                 at android.content.ContextWrapper.bindService(ContextWrapper.java:480)
                                                                                 at com.google.android.youtube.player.internal.r.e(Unknown Source)
                                                                                 at com.google.android.youtube.player.YouTubeThumbnailView.initialize(Unknown Source)
                                                                                 at example.com.videolistplaydemo.PlayVideoApi$VideoListAdapter.onBindViewHolder(PlayVideoApi.java:225)
                                                                                 at example.com.videolistplaydemo.PlayVideoApi$VideoListAdapter.onBindViewHolder(PlayVideoApi.java:190)
                                                                                 at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5471)
                                                                                 at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5504)
                                                                                 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4741)
                                                                                 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617)
                                                                                 at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)
                                                                                 at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)
                                                                                 at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)
                                                                                 at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1180)
                                                                                 at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1031)
                                                                                 at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4061)
                                                                                 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
                                                                                 at android.view.Choreographer.doCallbacks(Choreographer.java:591)
                                                                                 at android.view.Choreographer.doFrame(Choreographer.java:560)
                                                                                 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
                                                                                 at android.os.Handler.handleCallback(Handler.java:725)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                                 at android.os.Looper.loop(Looper.java:137)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5283)
                                                                                 at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                 at java.lang.reflect.Method.invoke(Method.java:511)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
                                                                                 at dalvik.system.NativeStart.main(Native Method)

我的代码如下,请帮助我!!!

public class PlayVideoApi extends YouTubeBaseActivity implements
        YouTubePlayer.OnInitializedListener {
    private RecyclerView listVideo;
    private ArrayList<NotificationBean> arrTemp;
    private NotificationBean mNotificationBean;
    private ArrayList<NotificationBean> mNotificationBeanArrayList = new ArrayList<>();
    private VideoListAdapter mAdapter;
    private static final int RECOVERY_DIALOG_REQUEST = 1;
    private String KEY = "AIzaSyACDeBPdqn3DlJ-HqvFMrrym2MTYDk7ar0";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.play_video_api);

        listVideo = (RecyclerView) findViewById(R.id.list);
        getData(PlayVideoApi.this, 0, "4", 3);
    }

    private void getData(Context context, final int posts_per_page, final String type, final int subcategoryid) {

        RequestQueue queue = Volley.newRequestQueue(context);
        StringRequest sr = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                JSONArray jArray;
                JSONArray jsonArray = null;
                JSONObject jsonObject = null;
                try {
                    jArray = new JSONArray(response);
                    JSONObject jObj = jArray.getJSONObject(0);
                    int code = jObj.getInt("code");
                    if (code == 0) {
                        Log.d("allcount:: :: ::", String.valueOf(jObj.optInt("allcount")));
                        if (jObj.has("result")) {
                            jsonArray = jObj.getJSONArray("result");
                            Log.d("EVENTLIST ARRAY=", jsonArray.length() + "");

                            if (jsonArray != null && jsonArray.length() > 0) {

                                arrTemp = new ArrayList<>();
                                for (int i = 0; i < jsonArray.length(); i++) {

                                    jsonObject = jsonArray.getJSONObject(i);
                                    mNotificationBean = new NotificationBean();
                                    mNotificationBean.id = jsonObject.getString("id");
                                    mNotificationBean.permalink = jsonObject.getString("permalink");
                                    mNotificationBean.image = jsonObject.getString("image");
                                    mNotificationBean.title = jsonObject.getString("title");
                                    mNotificationBean.videotype = jsonObject.getString("videotype");
                                    mNotificationBean.videoid = jsonObject.getString("videoid");
                                    mNotificationBean.desc = jsonObject.getString("desc");
                                    mNotificationBean.author_url = jsonObject.getString("author_url");
                                    mNotificationBean.like = jsonObject.getString("like");
                                    mNotificationBean.unlike = jsonObject.getString("unlike");
                                    mNotificationBean.comment = jsonObject.getInt("comment");
                                    mNotificationBeanArrayList.add(mNotificationBean);
                                    Log.v("ArrayList Size:: :: ", Integer.toString(mNotificationBeanArrayList.size()));

                                    Log.v("Videoooooooooooooooooooo", mNotificationBean.videoid);
                                    listVideo.setHasFixedSize(true);
                                    //to use RecycleView, you need a layout manager. default is LinearLayoutManager
                                    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(PlayVideoApi.this);
                                    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                                    listVideo.setLayoutManager(linearLayoutManager);
                                    mAdapter = new VideoListAdapter(PlayVideoApi.this, mNotificationBeanArrayList);
                                    listVideo.setAdapter(mAdapter);
                                }
                                Log.v("mUsers Size:: :: ", Integer.toString(mNotificationBeanArrayList.size()));
                            }
                        }
                    } else {
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(PlayVideoApi.this, "Check internet connection", Toast.LENGTH_LONG).show();
            }
        }) {

            @Override

            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("posts_per_page", Integer.toString(posts_per_page));
                params.put("type", type);
                return params;
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Content-Type", "application/x-www-form-urlencoded");
                return params;
            }
        };
        sr.setRetryPolicy(new DefaultRetryPolicy(
                15000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        queue.add(sr);

    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
        if (!wasRestored) {

            // loadVideo() will auto play video
            // Use cueVideo() method, if you don't want to play it automatically
            youTubePlayer.loadVideo(Config.YOUTUBE_VIDEO_CODE);

            // Hiding player controls
            youTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
        }
    }

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
        if (youTubeInitializationResult.isUserRecoverableError()) {
            youTubeInitializationResult.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
        } else {
            String errorMessage = String.format(
                    getString(R.string.error_player), youTubeInitializationResult.toString());
            Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
        }
    }

    public class VideoListAdapter extends RecyclerView.Adapter<VideoListAdapter.VideoInfoHolder> {

        //these ids are the unique id for each video
        //String[] VideoID = {"P3mAtvs5Elc", "nCgQDjiotG0", "P3mAtvs5Elc"};
        Context ctx;
        ArrayList<NotificationBean> mNotificationBeanArrayList;

        public VideoListAdapter(Context context, ArrayList<NotificationBean> mNotificationBeanArrayList) {
            this.ctx = context;
            this.mNotificationBeanArrayList = mNotificationBeanArrayList;
        }

        @Override
        public VideoInfoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_list_row, parent, false);
            return new VideoInfoHolder(itemView);
        }

        @Override
        public void onBindViewHolder(final VideoInfoHolder holder, final int position) {


            final YouTubeThumbnailLoader.OnThumbnailLoadedListener onThumbnailLoadedListener = new YouTubeThumbnailLoader.OnThumbnailLoadedListener() {
                @Override
                public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader.ErrorReason errorReason) {

                }

                @Override
                public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
                    youTubeThumbnailView.setVisibility(View.VISIBLE);
                    holder.relativeLayoutOverYouTubeThumbnailView.setVisibility(View.VISIBLE);
                }
            };
            Log.v("Keyyyyyyyyyyyyyy", Config.DEVELOPER_KEY);
            holder.youTubeThumbnailView.initialize(Config.DEVELOPER_KEY, new YouTubeThumbnailView.OnInitializedListener() {
                @Override
                public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader youTubeThumbnailLoader) {

                    youTubeThumbnailLoader.setVideo(mNotificationBeanArrayList.get(position).getVideoid());
                    youTubeThumbnailLoader.setOnThumbnailLoadedListener(onThumbnailLoadedListener);
                }

                @Override
                public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, YouTubeInitializationResult youTubeInitializationResult) {
                    //write something for failure
                }
            });
        }

        @Override
        public int getItemCount() {
            return mNotificationBeanArrayList.size();
        }

        public class VideoInfoHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

            protected RelativeLayout relativeLayoutOverYouTubeThumbnailView;
            YouTubeThumbnailView youTubeThumbnailView;
            protected ImageView playButton;

            public VideoInfoHolder(View itemView) {
                super(itemView);
                playButton = (ImageView) itemView.findViewById(R.id.btnYoutube_player);
                playButton.setOnClickListener(this);
                relativeLayoutOverYouTubeThumbnailView = (RelativeLayout) itemView.findViewById(R.id.relativeLayout_over_youtube_thumbnail);
                youTubeThumbnailView = (YouTubeThumbnailView) itemView.findViewById(R.id.youtube_thumbnail);
            }

            @Override
            public void onClick(View v) {
//                Bundle args = new Bundle();
//                args.putString("URL", videoUrl );
                Intent intent = YouTubeStandalonePlayer.createVideoIntent((Activity) ctx, Config.DEVELOPER_KEY, String.valueOf(mNotificationBeanArrayList.get(getLayoutPosition())));
                ctx.startActivity(intent);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我使用https://github.com/danylovolokh/VideoPlayerManager解决了它只需更改

public AssetVideoItem(String url, VideoPlayerManager<MetaData> videoPlayerManager, Picasso imageLoader, int imageResource) {
        super(videoPlayerManager);
        Url = url;
        mImageLoader = imageLoader;
        mImageResource = imageResource;
    }

在AssetVideoItem和

public static AssetVideoItem createItemFromUrl(String url, int imageResource, Activity activity, VideoPlayerManager<MetaData> videoPlayerManager) throws IOException {
        return new AssetVideoItem(url, videoPlayerManager, Picasso.with(activity),imageResource);
    }
and use in main class
mList.add(ItemFactory.createItemFromUrl("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4", R.drawable.video_sample_1_pic, mActivity, mVideoPlayerManager));
在ItemFactory中