AutoplayVideos, 在recyclerview中,Android库从url自动播放/暂停视频

分享于 

15分钟阅读

GitHub

  繁體 雙語
Android library to auto-play/pause videos from url in recyclerview.
  • 源代码名称:AutoplayVideos
  • 源代码网址:http://www.github.com/Krupen/AutoplayVideos
  • AutoplayVideos源代码文档
  • AutoplayVideos源代码下载
  • Git URL:
    git://www.github.com/Krupen/AutoplayVideos.git
    Git Clone代码到本地:
    git clone http://www.github.com/Krupen/AutoplayVideos
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Krupen/AutoplayVideos
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    AutoplayVideos

    APIAndroid ArsenalAndroid WeeklyAndroidDev Digest

    GitHub starsGitHub forksGitHub watchersGitHub followers
    Twitter Follow

    创建这个库的目的是为了方便地实现 recyclerview。

    它的目标是解决以下问题:

    • 滚动时闪烁。
    • 视频开始时延迟或者跳过帧。
    • 错误。

    它具有以下特性:

    • 在查看时自动播放视频。
    • 当不在视图中或者部分查看时自动暂停视频。
    • 静音/取消静音视频。
    • 仅播放第一个可见视频的选项。
    • 将视频下载到后台存储以加快加载速度。
    • 演示

    autoplayvideos_demo

    下载

    Gradle

    步骤 1 将jCenter存储库添加到项目级 build.gradle 文件中

    allprojects {
     repositories {
     jcenter()
     }
    }

    向应用程序级 build.gradle file: 添加依赖项1.1

    dependencies {
     compile 'com.allattentionhere:autoplayvideos:0.2.0'}

    或者 Maven

    <dependency><groupId>com.allattentionhere</groupId><artifactId>autoplayvideos</artifactId><version>0.2.0</version><type>pom</type></dependency>
    权限

    将以下权限添加到 AndroidManifest.xml

    
    <uses-permission android:name="android.permission.INTERNET"/>
    
    
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    
    
    
    用法

    AAH_VideoImage 添加到单个列表项 single_card.xml的xml文件中:

    
    <?xml version="1.0" encoding="utf-8"?>
    
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
    
     xmlns:card_view="http://schemas.android.com/apk/res-auto"
    
    
     android:layout_width="match_parent"
    
    
     android:layout_height="wrap_content">
    
    
    
     <android.support.v7.widget.CardView
    
    
     android:id="@+id/card_view"
    
    
     android:layout_width="wrap_content"
    
    
     android:layout_height="wrap_content">
    
    
    
     <LinearLayout
    
    
     android:layout_width="wrap_content"
    
    
     android:layout_height="wrap_content"
    
    
     android:orientation="vertical">
    
    
    
     <FrameLayout
    
    
     android:layout_width="300dp"
    
    
     android:layout_height="150dp">
    
    
    
     <com.allattentionhere.autoplayvideos.AAH_VideoImage
    
    
     android:layout_width="match_parent"
    
    
     android:layout_height="match_parent"/>
    
    
    
     <ImageView
    
    
     android:id="@+id/img_vol"
    
    
     android:layout_width="wrap_content"
    
    
     android:layout_height="wrap_content"
    
    
     android:layout_gravity="right|bottom"
    
    
     android:layout_margin="8dp"
    
    
     android:src="@drawable/ic_unmute"/>
    
    
     </FrameLayout>
    
    
    
     <TextView
    
    
     android:id="@+id/tv"
    
    
     android:layout_width="match_parent"
    
    
     android:layout_height="wrap_content"
    
    
     android:gravity="center"/>
    
    
    
     </LinearLayout>
    
    
     </android.support.v7.widget.CardView>
    
    
    </LinearLayout>
    
    
    
    

    AAH_CustomRecyclerView 添加到你的Activity 布局 xml MainActivity.xml:

    
    <?xml version="1.0" encoding="utf-8"?>
    
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
    
     android:layout_width="match_parent"
    
    
     android:layout_height="match_parent"
    
    
     android:orientation="vertical">
    
    
    
     <com.allattentionhere.autoplayvideos.AAH_CustomRecyclerView
    
    
     android:id="@+id/rv_home"
    
    
     android:layout_width="wrap_content"
    
    
     android:layout_height="wrap_content"/>
    
    
    
    </LinearLayout>
    
    
    
    

    设置适配器,具体如下:

    • 适配器应该扩展 AAH_VideosAdapter
    • ViewHolder应该扩展 AAH_CustomViewHolder
    • onBindViewHolder 方法中设置缩略图图像url和视频 url。
    
    public class MyVideosAdapter extends AAH_VideosAdapter {
    
    
    
     private List<MyModel> list;
    
    
     Picasso picasso;
    
    
    
     public class MyViewHolder extends AAH_CustomViewHolder {
    
    
     final TextView tv;
    
    
     final ImageView img_vol,img_playback;
    
    
     boolean isMuted;//to mute/un-mute video (optional)
    
    
    
     public MyViewHolder(View x) {
    
    
     super(x);
    
    
     tv = ButterKnife.findById(x, R.id.tv);
    
    
     img_vol = ButterKnife.findById(x, R.id.img_vol);
    
    
     img_playback = ButterKnife.findById(x, R.id.img_playback);
    
    
     }
    
    
     }
    
    
    
     public MyVideosAdapter(List<MyModel> list_urls, Picasso p) {
    
    
     this.list = list_urls;
    
    
     this.picasso = p;
    
    
     }
    
    
    
     @Override
    
    
     public AAH_CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
    
     View itemView = LayoutInflater.from(parent.getContext())
    
    
    . inflate(R.layout.single_card, parent, false);
    
    
     return new MyViewHolder(itemView);
    
    
     }
    
    
    
     @Override
    
    
     public void onBindViewHolder(AAH_CustomViewHolder holder, int position) {
    
    
     ((MyViewHolder) holder).tv.setText(list.get(position).getName());
    
    
    
    //todo
    
    
     holder.setImageUrl(list.get(position).getImage_url());
    
    
     holder.setVideoUrl(list.get(position).getVideo_url());
    
    
    //load image/thumbnail into imageview
    
    
     if (list.get(position).getImage_url()!= null &&!list.get(position).getImage_url().isEmpty())
    
    
     picasso.load(holder.getImageUrl()).config(Bitmap.Config.RGB_565).into(holder.getAAH_ImageView());
    
    
     }
    
    
    
     @Override
    
    
     public int getItemCount() {
    
    
     return list.size();
    
    
     }
    
    
    
     @Override
    
    
     public int getItemViewType(int position) {
    
    
     return 0;
    
    
     }
    
    
    }
    
    
    
    

    在设置适配器和( 可选) 滚动之前,在 Activity 中使用 setActivity 以编程方式初始化初始屏幕上的视频:

    
     recyclerView.setActivity(this);//todo before setAdapter
    
    
     recyclerView.setAdapter(mAdapter);
    
    
    
    

    开始播放视频( 可选)

    当屏幕启动和用户未滚动时调用这两个函数来启动视频播放。

    
    recyclerView.smoothScrollBy(0,1);
    
    
    recyclerView.smoothScrollBy(0,-1);
    
    
    
    

    播放 1st 视频( 可选)

    设置这里参数将只在 1st 个完全可见的RecyclerView ViewHolder中播放视频。

    
    recyclerView.setPlayOnlyFirstVideo(true);//false by default
    
    
    
    

    下载视频到本地存储( 可选)

    你可以在viewholder加载的背景中开始下载视频。 你可以更改下载路径。

    
    recyclerView.setDownloadPath(Environment.getExternalStorageDirectory() +"/MyVideo");//optional
    
    
    recyclerView.setDownloadVideos(true);//false by default
    
    
    
    

    你可以选择通过将url列表传递到以下功能来开始下载所有视频:

    
    List<String> urls = new ArrayList<>();
    
    
     for (MyModel object : modelList) {
    
    
     if (object.getVideo_url()!= null && object.getVideo_url().endsWith(".mp4"))
    
    
     urls.add(object.getVideo_url());
    
    
     }
    
    
    recyclerView.preDownload(urls);
    
    
    
    

    将以下权限添加到 AndroidManifest.xml。 在 Marshmallow 和上设备上请求运行时权限。

    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    
    
    

    删除. mp4 检查( 可选)

    默认情况下,它检查以 .mp4 结尾的URL ;它不被视为视频 URL。 你可以通过如下设置参数来覆盖这个。 请谨慎使用这里选项,并确保仅提供视频网址。

    
    recyclerView.setCheckForMp4(false);//true by default
    
    
    
    

    实时暂停视频( 可选)

    当 Activity/fragment 停止( 用户接收电话,最小化应用等) 时,调用以下方法停止视频

    
     @Override
    
    
     protected void onStop() {
    
    
     super.onStop();
    
    
     recyclerView.stopVideos();
    
    
     }
    
    
    
    

    当应用程序恢复时,恢复视频( 可选)

    在应用恢复时调用以下方法( 在最小化应用后打开应用程序等)

    
     @Override
    
    
     protected void onResume() {
    
    
     super.onResume();
    
    
     recyclerView.playAvailableVideos(0);
    
    
     }
    
    
    
    

    部分可见视频( 可选)

    调用以下方法设置视频开始播放所需的视图百分比。

    
     recyclerView.setVisiblePercent(50);
    
    
    
    

    在视频开始和暂停时获取回调

    你可以覆盖以下 AAH_CustomViewHolder 方法在视频开始播放或者暂停时获取回调。

    
     @Override
    
    
     public void videoStarted() {
    
    
     super.videoStarted();
    
    
     img_playback.setImageResource(R.drawable.ic_pause);
    
    
     if (isMuted) {
    
    
     muteVideo();
    
    
     img_vol.setImageResource(R.drawable.ic_mute);
    
    
     } else {
    
    
     unmuteVideo();
    
    
     img_vol.setImageResource(R.drawable.ic_unmute);
    
    
     }
    
    
     }
    
    
     @Override
    
    
     public void pauseVideo() {
    
    
     super.pauseVideo();
    
    
     img_playback.setImageResource(R.drawable.ic_play);
    
    
     }
    
    
    
    

    手动播放或者暂停播放视频

    你可以允许用户在 onBindViewHolder 中添加以下代码来播放或者暂停任何视频:

    
     ((MyViewHolder) holder).img_playback.setOnClickListener(new View.OnClickListener() {
    
    
     @Override
    
    
     public void onClick(View v) {
    
    
     if (holder.isPlaying()) {
    
    
     holder.pauseVideo();
    
    
     holder.setPaused(true);
    
    
     } else {
    
    
     holder.playVideo();
    
    
     holder.setPaused(false);
    
    
     }
    
    
     }
    
    
     });
    
    
    
    

    静音或者取消静音视频

    通过在 onBindViewHolder 中添加以下代码,可以静音/取消静音:

    
     holder.getAah_vi().setOnClickListener(new View.OnClickListener() {
    
    
     @Override
    
    
     public void onClick(View v) {
    
    
     if (((MyViewHolder) holder).isMuted) {
    
    
     holder.unmuteVideo();
    
    
     ((MyViewHolder) holder).img_vol.setImageResource(R.drawable.ic_unmute);
    
    
     } else {
    
    
     holder.muteVideo();
    
    
     ((MyViewHolder) holder).img_vol.setImageResource(R.drawable.ic_mute);
    
    
     }
    
    
     ((MyViewHolder) holder).isMuted =!((MyViewHolder) holder).isMuted;
    
    
     }
    
    
     });
    
    
    
    

    在视频中设置循环

    通过在 onBindViewHolder 中添加以下代码来设置视频循环:

    
    holder.setLooping(true);//optional - true by default
    
    
    
    
    高速缓存视频( 可选)

    建议 setDownloadVideos(value) 到 true。 但是,如果你不想使用这里选项,我们建议你使用 AndroidVideoCache库。 以下是你可以与我们的库一起使用的方法:

    Initilize HttpProxyCacheServer

    Initilize HttpProxyCacheServer 在你的应用程序类和 Manifest 文件中的register 应用程序类。

    
    public class MyApplication extends Application {
    
    
     private static HttpProxyCacheServer proxy;
    
    
    
     public static HttpProxyCacheServer getProxy() {
    
    
     return proxy;
    
    
     }
    
    
    
     @Override
    
    
     public void onCreate() {
    
    
     super.onCreate();
    
    
     proxy = new HttpProxyCacheServer(this);
    
    
     }
    
    
    } 
    
    
    
    

    设置代理视频 URL

    在VideosAdapter中,按如下所示设置视频网址:

    
    holder.setVideoUrl(MyApplication.getProxy().getProxyUrl(list.get(position).getVideo_url()+""));//url should not be null
    
    
    
    

    你还可以使用高级选项来缓存库所支持的。 请参考他们的文档。

    使用 Cloudinary ( 可选)

    建议使用 Cloudinary.com 插件来承载视频,因为它提供了简单的缩略图生成调整/裁剪视频/cropping/cropping。

    变更日志我们的其他库开发人员开发的基于的应用程序

    Price StalkerShow Card GameSafio chat

    许可证

    版权所有 2017 Krupen Ghetiya

    在Apache许可以证下许可以证版本 2.0 ("许可以证") ;你可以能不使用这里文件,除了符合许可以证。 你可以获得许可证的副本在*

    http://www.apache.org/licenses/LICENSE-2.0

    在规定的法律或者书面许可下,在许可条款下分发的软件在不保证任何种类的担保或者条件的前提下分发,或者明示或者隐含。 查看许可协议下特定语言的许可权限和限制的许可证。


    AUTO  play  视频  URL  videos  android-l  
    相关文章