手机影音第五天 视频列表的显示与播放以及个别牌子手机播放的问题

先展示下本次做好的效果:

    

手机影音第五天 视频列表的显示与播放以及个别牌子手机播放的问题

下面是播放时的画面,只截取了视频框

手机影音第五天 视频列表的显示与播放以及个别牌子手机播放的问题

  

  接着上次的说,上次说到了去获取手机里的视频信息,下面就用listview来展示视频列表与调用系统播放器来播放视频。

    1、根据获取到的视频列表,去设置适配器Adapter,然后利用前面写的listview的例子,来展示数据,这个就不详细说明了。

    2、点击单个listview的数据,来监听其事件,在监听的方法里,去调取播放方法。

        2.1利用隐式意图去调用所有符合要求的播放器。

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    class MyOnItemClickListener implements AdapterView.OnItemClickListener {
 
 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //根据position获取list中的结果
            MediaItem item = mediaList.get(position);
            //Toast.makeText(context,"当前视频名称"+item.getName(),Toast.LENGTH_SHORT).show();
 
            //调取系统播放器  ---隐式意图
            Intent intent=new Intent(Intent.ACTION_VIEW);
           Uri uri=Uri.parse("file://"+item.getData());
            intent.setDataAndType(uri,"video/mp4"); //所有格式
            context.startActivity(intent);
        }
    }

    在这里就是要注意了,网上有的文章里,是这样写的

1
2
3
             Intent intent=new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(item.getData(),"video/mp4"); //所有格式
            context.startActivity(intent);

    这样写就导致无法弹出系统里符合播放条件的播放器,需要在URI做下处理,在前面加上file://这样才行。


    2.2 利用显示意图,直接调用mediaplayer来播放,自己封装了一下mediaplayer,以后可以自己定义播放器的样式,甚至打广告。这个SystemVideoPlayer是自己写的类。

1
2
3
4
Intent intent=new Intent(context,SystemVideoPlayer.class);
Uri uri=Uri.parse("file://"+item.getData());
intent.setDataAndType(uri,"video/mp4"); //所有格式
context.startActivity(intent);

    2.3 自定义的systemVideoPlayer,注意这个类继承Activity,要去AndroidManifext.xml里注册

    在这个类里,去监听videoView的准备播放状态,播放出错状态,播放完成状态,并且设置控制器来控制视频的暂停,快进,快退功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.yuanlp.mobileplayer.activity;
 
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
 
import com.yuanlp.mobileplayer.R;
 
/**
 * Created by 原立鹏 on 2017/7/16.
 * 系统播放器
 * 注意去Manifext.xml里注册
 */
 
public class SystemVideoPlayer extends Activity{
    private VideoView videoview;
    private Uri uri;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.system_video_player); //自定义的播放器样式,暂时为简单版    
        videoview= (VideoView) findViewById(R.id.videoview);
 
        //得到播放地址,从intent中获取
        uri = getIntent().getData();
        if (uri!=null){
            videoview.setVideoURI(uri);
        }
 
        //准备好的监听,监听是否视频准备好
        videoview.setOnPreparedListener(new MyOnPreparedListener());
        //播放出错了的监听
        videoview.setOnErrorListener(new MyOnErrorListener());
        //播放完成的监听
        videoview.setOnCompletionListener(new MyOnCompletionListener());
 
        //设置控制面板,系统自带的
        videoview.setMediaController(new MediaController(this));
 
 
    }
    /**
     * 准备好播放时的监听
     */
    class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {
 
        @Override
        public void onPrepared(MediaPlayer mp) {
            videoview.start(); //开始播放
 
        }
    }
 
    /**
     * 播放出错
     */
    class MyOnErrorListener implements MediaPlayer.OnErrorListener {
 
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            //出错后,系统会自动提示播放出错,同时自己也弹一个吐司
            Toast.makeText(SystemVideoPlayer.this,"播放出错",Toast.LENGTH_SHORT).show();
            return false;
        }
    }
 
    /**
     * 播放完成的监听
     */
    class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {
 
 
        @Override
        public void onCompletion(MediaPlayer mp) {
            Toast.makeText(SystemVideoPlayer.this"播放完成", Toast.LENGTH_SHORT).show();
        }
    }
}

    2.4 播放器样式布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
                android:gravity="center"
                android:background="#000000"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
 
    <VideoView
        android:layout_centerInParent="true"
        android:id="@+id/videoview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>


3、VideoPager的完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package com.yuanlp.mobileplayer.pager;
 
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.provider.MediaStore;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
import com.yuanlp.mobileplayer.R;
import com.yuanlp.mobileplayer.activity.SystemVideoPlayer;
import com.yuanlp.mobileplayer.adapter.MyAdapter;
import com.yuanlp.mobileplayer.base.BasePager;
import com.yuanlp.mobileplayer.bean.MediaItem;
import com.yuanlp.mobileplayer.utils.LogUtil;
import com.yuanlp.mobileplayer.utils.Utils;
 
import java.util.ArrayList;
import java.util.List;
 
 
/**
 * Created by 原立鹏 on 2017/7/13.
 * 本地视频的页面
 */
 
public class VideoPager extends BasePager {
 
    private ListView listview;
    private TextView nomedia;
    private ProgressBar pb_loding;
    private Utils utils;
 
    //保存所有的媒体信息的集合
    private List<MediaItem> mediaList;
 
    private MyAdapter myAdapter;
 
    public VideoPager(Context context) {
        super(context);
        utils=new Utils();
 
    }
 
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (mediaList!=null&&mediaList.size()>0){
                //有数据
                //设置适配器
                myAdapter=new MyAdapter(context,mediaList);
                listview.setAdapter(myAdapter);
               //Toast.makeText(context,"有数据",Toast.LENGTH_SHORT).show();
                nomedia.setVisibility(View.GONE);
 
            }else{
                //没有数据
                //文本显示
                Toast.makeText(context,"没有数据",Toast.LENGTH_SHORT).show();
 
            }
            pb_loding.setVisibility(View.GONE);
            //progressbar隐藏
        }
    };
    /**
     * 强制子类实现特定的效果
     *
     * @return
     */
    @Override
    public View initView() {
        LogUtil.e("本地视频被初始化了");
       View view=View.inflate(context, R.layout.video_pager,null);
        listview= (ListView) view.findViewById(R.id.listview);
        nomedia= (TextView) view.findViewById(R.id.tv_nomedia);
        pb_loding= (ProgressBar) view.findViewById(R.id.pb_loading);
 
        //设置listview的item的点击事件
        listview.setOnItemClickListener(new MyOnItemClickListener());
 
        return view;
    }
 
    @Override
    public void initData() {
        super.initData();
        LogUtil.e("本地视频页面的数据被初始化了");
        //加载本地数据
        getDataFromLocal();
 
    }
 
    class MyOnItemClickListener implements AdapterView.OnItemClickListener {
 
 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //根据position获取list中的结果
            MediaItem item = mediaList.get(position);
            //Toast.makeText(context,"当前视频名称"+item.getName(),Toast.LENGTH_SHORT).show();
 
//            //调取系统播放器  ---隐式意图
//            Intent intent=new Intent(Intent.ACTION_VIEW);
//           Uri uri=Uri.parse("file://"+item.getData());
//            intent.setDataAndType(uri,"video/mp4"); //所有格式
//            context.startActivity(intent);
 
            //调用自己写的播放器 ---显示意图
 
            Intent intent=new Intent(context,SystemVideoPlayer.class);
            Uri uri=Uri.parse("file://"+item.getData());
            intent.setDataAndType(uri,"video/mp4"); //所有格式
            context.startActivity(intent);
 
        }
    }
 
    /**
     * 从本地sd卡获取数据,有2中办法
     * 1、遍历sd卡,根据后缀名
     * 2、从内容提供者中获取,系统有自己会去扫描所有media信息。
     * 3/6.0后的系统,需要加上动态权限
     */
    private void getDataFromLocal() {
        mediaList=new ArrayList<>();
 
        new Thread(){
            @Override
            public void run() {
                super.run();
                SystemClock.sleep(2000);
                //根据上下文,去获取内容解析者
                ContentResolver resolver = context.getContentResolver();
 
                Uri uri= MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                String[] objs={
                       MediaStore.Video.Media.DISPLAY_NAME, //视频文件名称
                        MediaStore.Video.Media.DURATION,  //视频时长
                        MediaStore.Video.Media.SIZE, //文件大小
                        MediaStore.Video.Media.DATA, //视频的绝对地址
                        MediaStore.Video.Media.ARTIST,  //歌曲的演唱者,艺术家(音频可能会有该字段)
                };
                Cursor cursor = resolver.query(uri, objs, nullnullnull);
                if (cursor!=null){
                    while(cursor.moveToNext()){
                        MediaItem item=new MediaItem();
 
                        String name=cursor.getString(0); //名称
                        item.setName(name);
 
                        long duration=cursor.getLong(1); //时长
                        item.setDuration(duration);
 
                        long size=cursor.getLong(2); //视频大小
                        item.setSize(size);
 
                        String data=cursor.getString(3); //视频的绝对地址
                        item.setData(data);
 
                        String artist=cursor.getString(4); //艺术家
                        item.setArtist(artist);
 
                        mediaList.add(item); //把每个item数据放到集合中
                    }
                    cursor.close();
                }
 
                //发消息,提示加载完media
 
                handler.sendEmptyMessage(0);
            }
        }.start();
 
    }
 
 
 
}

4、SystemVideoPlayer 自定义播放器类的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.yuanlp.mobileplayer.activity;
 
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
 
import com.yuanlp.mobileplayer.R;
 
/**
 * Created by 原立鹏 on 2017/7/16.
 * 系统播放器
 * 注意去Manifext.xml里注册
 */
 
public class SystemVideoPlayer extends Activity{
    private VideoView videoview;
    private Uri uri;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.system_video_player);
        videoview= (VideoView) findViewById(R.id.videoview);
 
        //得到播放地址,从intent中获取
        uri = getIntent().getData();
        if (uri!=null){
            videoview.setVideoURI(uri);
        }
 
        //准备好的监听,监听是否视频准备好
        videoview.setOnPreparedListener(new MyOnPreparedListener());
        //播放出错了的监听
        videoview.setOnErrorListener(new MyOnErrorListener());
        //播放完成的监听
        videoview.setOnCompletionListener(new MyOnCompletionListener());
 
        //设置控制面板,系统自带的
        videoview.setMediaController(new MediaController(this));
 
 
    }
    /**
     * 准备好播放时的监听
     */
    class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {
 
        @Override
        public void onPrepared(MediaPlayer mp) {
            videoview.start(); //开始播放
 
        }
    }
 
    /**
     * 播放出错
     */
    class MyOnErrorListener implements MediaPlayer.OnErrorListener {
 
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            //出错后,系统会自动提示播放出错,同时自己也弹一个吐司
            Toast.makeText(SystemVideoPlayer.this,"播放出错",Toast.LENGTH_SHORT).show();
            return false;
        }
    }
 
    /**
     * 播放完成的监听
     */
    class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {
 
 
        @Override
        public void onCompletion(MediaPlayer mp) {
            Toast.makeText(SystemVideoPlayer.this"播放完成", Toast.LENGTH_SHORT).show();
        }
    }
}



















本文转自老婆的宝宝51CTO博客,原文链接:http://blog.51cto.com/cm0425/1948069 ,如需转载请自行联系原作者


上一篇:2亿人在家开工,他们最关心的是......


下一篇:犀利发问阿里达摩院:过去三年做的预测真实进展如何?