使用 Kotlin 读取本地视频并使用Vitamio框架编写万能播放器进行播放(一)

## 一.首先配置Kotlin环境  ##
 1.在Android Studio 中  选择File-->Settings--->Pluguns  在进行收索Kotlin 进行安装,在重启Android Studio 即可
 2.新建一个项目,在你新建的项目下的build.gradle 配置Kotlin的版本号
    buildscript {
    
    
    ext.kotlin_version = '1.0.0'
    ext.kotlin_version = '1.1.2-4'
    ext.support_version = '23.1.1'
    
    ext.anko_version = '0.8.2'
    repositories {
    jcenter()
    }
    dependencies {
       
    classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
    }
3.在你新建的项目的module下的build.gradle去配置一些属性

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'

在dependencies 配置
    dependencies {

  
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  
    
    }


4. 这些都完成了之后 ,在Android Studio 选择Code-->Convert Java File to Kolin File  系统会自动把你的java代码转换成Kolitn代码
5. 测试  在你.xml 编写一个TextView


    <TextView
    android:id="@+id/tv_test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />


 
然后在你的Kolitn 代码中 可以直接得到你刚才编写TextView控件
根据id可以进行操作 

    tv_test.text="Hello Kolitn"
这时候会提示tv_test找不到 ,在你的代码中导入Kolitn包即可

    import kotlinx.android.synthetic.main.activity_main.*

运行你的程序,界面上显示 Hello Kolitn证明你的Kolitn编译环境搭建完成

## 二.获取本地视频 ##

1.首先建一个been对象


    class VideoBeen(name: String, duration: Long, size: Long, data: String, imageUrl: String, desc: String) : Serializable {
    val name: String
    val duration: Long
    val size: Long
    val data: String
    val imageUrl: String
    val desc: String


    init {
        this.name = name
        this.duration = duration
        this.size = size
        this.data = data
        this.imageUrl = imageUrl
        this.desc = desc
    }
    }
说明:
  (1)参数就不多说了,这个Kotlin建been对象和java建been对象是不同的,java需要写大量的get()和set()方法,而Kotlin却不用

  (2) java实现接口用implement 继承用extends 而Kotlin继承和实现接口都用":"就行了,如果想实现多个接口,用","分开即可

    eg:class MainActivity : 接口1, 接口2...
  
  (3)声明字段类型 val name:String   name是字段的名称  String是字段的类型  
//用val或var声明变量,指明它们是不可变的或可变的


2.创建一个list 

    ` var list = ArrayList<VideoBeen>()`

java 中创建list都是new  而Kolitn不需要new

3.得到本地视频并把对象赋值给list 
 
      fun initData() {
    
    val contentResolver = this.getContentResolver()
    val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
    
    val objects = arrayOf(MediaStore.Video.Media.DISPLAY_NAME, //在Sdcard显示的名称
    MediaStore.Video.Media.DURATION, //视频的长度
    MediaStore.Video.Media.SIZE, //视频文件大小
    MediaStore.Video.Media.DATA//视频的绝对地址
    )
    val cursor = contentResolver.query(uri, objects, null, null, null)
    
    if (cursor != null) {
    while (cursor.moveToNext()) {
    val name = cursor.getString(0)
    val duration = cursor.getLong(1)
    val size = cursor.getLong(2)
    val data = cursor.getString(3)
    
    val mediaItem = VideoBeen(name, duration, size, data, "", "");
    //把视频添加到列表中
    list.add(mediaItem)
    
    }
    
    
    cursor.close()
    }
    
    //Log.e("list", "list====" + list.size);
    }

## 三.Kotiln怎么写adapter ##

1.在你module下的build.gradle添加recycleview包

    compile 'com.android.support:recyclerview-v7:24.0.0'

2.在布局中

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v7.widget.RecyclerView
    android:id="@+id/lv_video"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="@android:color/transparent" />
    
    
    
    
    <TextView
    android:visibility="gone"
    android:id="@+id/tv_nomedia"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="没有找到视频..."
    android:textColor="@android:color/black"
    android:textSize="18sp" />
    
    <ProgressBar
    android:id="@+id/pb_loading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
     />
    
    </RelativeLayout>
    
3.写adapter 先看代码


    class VideoAdapter(val context: Context, val list: List<VideoBeen>, val inter: positioninterface.posi) : RecyclerView.Adapter<VideoAdapter.ViewHolder>() {


    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {


        val mediaItem = list.get(position)

        holder!!.tv_name.text = mediaItem.name
        val itemview = holder.rl
        itemview.setOnClickListener {
            inter.getposition(position);

        }
        val size = mediaItem.size;
        holder!!.tv_size.text = Formatter.formatFileSize(context, size)
        holder!!.tv_duration.text = mediaItem.desc


    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {


        val view = View.inflate(context, R.layout.item_video_pager, null);
        val viewHolder = ViewHolder(view)

        return viewHolder;

    }

    override fun getItemCount(): Int {


        return list.size;
    }


    class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {


        var iv_icon: ImageView = itemView!!.findViewById(R.id.iv_icon) as ImageView;
        var tv_name: TextView = itemView!!.findViewById(R.id.tv_name) as TextView;
        var tv_duration: TextView = itemView!!.findViewById(R.id.tv_duration) as TextView;
        var tv_size: TextView = itemView!!.findViewById(R.id.tv_size) as TextView;
        var rl: RelativeLayout = itemView!!.findViewById(R.id.rl) as RelativeLayout;
    }


    }

说明:

 (1)VideoAdapter()中的参数,val context: Context 上下文  
 val list: List<VideoBeen> 视频的集合 inter: positioninterface.posi 接口的实现

 (2)继承RecyclerView.Adapter 刚才说过了Kolitn继承用“:”
 
 (3)然后Alt+Enter,实现方法
  
 (4)坑爹的ViewHolder 在adapter中还带自己写findviewbyid,
不用findviewbyid得到对象的话,一直抱空指针(但是会有人提出疑问,Kotlin不是可以根据id,来得到对象吗? 我这样测试了,压根不让你导包)如果有大神知道怎么优化这点,欢迎骚扰
  
 (5) 怎么写布局,和实现接口的监听在这里就不说了(随后会把代码上传),说说怎么给对象赋值吧, java 代码holder..settext=""   而kotlin中
tv_size
就没有settext这个方法,而是 holder!!.tv_name.text="" 即可 

话说这两个!!是什么东西

你把这个两个!!去掉的话,系统会提示你

Only sfe(?.) or non-null asserted(!!.) calls are allowed on a nullable receiver of type View?
 简单的说这个对象可能为空或者是不安全的,在这里不允许在这个使用加上(?)或者(!!)才能使用

## 四给recycleview设置adapter ##

1.和java代码没什么区别 (就是声明对象不new)

    private fun setadapter() {

        val videoAdapter = VideoAdapter(this, list, this)
        val mLayoutManager = LinearLayoutManager(this)
        lv_video.setLayoutManager(mLayoutManager)
        lv_video.adapter = videoAdapter;
    }

## 五美化界面 ##
1.在系统需找本地视频的时候加一个提示

2.找不到视频,给用户一个提示

    private fun setvisible(){
        pb_loading.visibility=View.GONE
        if(list.size<=0){
            tv_nomedia.visibility=View.VISIBLE
        }

    }
3.实现接口的监听
    

     public class positioninterface {
    public interface posi {

        public fun getposition(property: Int)

    }

    }

来判断用户点击的是哪个item

到这里就可以把本地视频给展示出来了

使用 Kotlin 读取本地视频并使用Vitamio框架编写万能播放器进行播放(二)地址

http://blog.youkuaiyun.com/o_xiaojian/article/details/72957254


源码

链接:http://pan.baidu.com/s/1kVuoUpx 密码:9rmo





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值