




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、321影音 讲师:杨光福 微博:22_当万能播放器播放失败的时候提示用户&点击确定的时候退出播放器-111_当播放出错回调videoview.setOnErrorListener(new OnErrorListener() Overridepublic boolean onError(MediaPlayer mp, int what, int extra) /Toast.makeText(getApplicationContext(), "视频播放出错", 1).show();/1.提示用户-基本做法/什么情况导致播放失败/a,播放过程中没有网络;-重试/b,播放一
2、个不支持的格式(一进来就报错)-用万能播放器/c,下载视频的时候中间有空白-无法解决 new AlertDialog.Builder(VitamioPlayerActivity.this) .setMessage("播放器不支持该视频") .setPositiveButton("确定", new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int whichButton) /退出播放器 finish(); ) .setCancelable(fa
3、lse) .show();推荐精选return true;);23_系统播放器和万能播放器手动切换相关处理-291_系统播放器和万能播放器手动切换case R.id.btn_switch: new AlertDialog.Builder(VideoPlayerActivity.this) .setMessage("当前是系统播放器,是否要切换万能播放器播放") .setNegativeButton("下次再说", null) .setPositiveButton("立刻切换", new DialogInterface.OnClickL
4、istener() public void onClick(DialogInterface dialog, int whichButton) /退出播放器 startVitamioPlyer(); ) .setCancelable(false) .show();break;/* * 设置标题和播放数据 */private void setData() if(videoLists !=null &&videoLists.size()>0)VideoItem videoItem= videoLists.get(currentPosition);tv_video_name.se
5、tText(videoItem.getTitle();isNetUri = utils.isNetUri(Uri.parse(videoItem.getData();videoview.setVideoPath(videoItem.getData();elseif(uri!=null)isNetUri = utils.isNetUri(uri);videoview.setVideoURI(uri);tv_video_name.setText(uri+"");推荐精选.2_支持播放网络视频有缓冲效果/* * 判断是否是网络资源 * param uri * return */p
6、ublic boolean isNetUri(Uri uri) boolean result = false;if (uri != null) if (uri.toString().contains("http")| uri.toString().contains("RTSP")| uri.toString().contains("MMS") result = true; else result = false;return result; 在handler中if(isNetUri)/设置缓存-针对的网络视频/设置缓中进度-到那个等分
7、int buffer = videoview.getBufferPercentage();/0100;/要缓冲多少int totalBuffer = buffer * video_seekBar.getMax();/得到缓存的进度 int secondaryProgress = totalBuffer / 100;推荐精选 video_seekBar.setSecondaryProgress(secondaryProgress);elsevideo_seekBar.setSecondaryProgress(0);3_屏蔽系统播放器和Vitamio播放器切换的动画res/anim 目录下<
8、?xml version="1.0" encoding="utf-8"?><translate xmlns:android=" android:toXDelta="0" android:fromYDelta="0" android:duration="500" android:toYDelta="0" android:fromXDelta="0" ></translate>4_播放器释放资源在handler中 cas
9、e FINISH:if(videoview != null)videoview.stopPlayback();finish();/关闭播放器break;04_音乐播放器推荐精选01_基于视频列表修改成音乐列表-28 public class AudioListActivity extends BaseActivity private ArrayList<AudioItem> audioLists;private ListView lv_audio_list;private TextView tv_noaudio;private Utils utils;private Handler
10、 handler = new Handler()public void handleMessage(android.os.Message msg) lv_audio_list.setAdapter(new VideoListAdapter();if(audioLists!=null&&audioLists.size()>0)tv_noaudio.setVisibility(View.GONE);elsetv_noaudio.setVisibility(View.VISIBLE);Overrideprotected void onCreate(Bundle savedIns
11、tanceState) super.onCreate(savedInstanceState);setTitle("本地音乐");setRightButton(View.GONE);utils = new Utils();lv_audio_list = (ListView) findViewById(R.id.lv_audio_list);tv_noaudio = (TextView) findViewById(R.id.tv_noaudio);/ 得到手机的视频getVideData();lv_audio_list.setOnItemClickListener(new On
12、ItemClickListener() Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) /点击的时候只传播放地址AudioItem videoItem = audioLists.get(position);String path = videoItem.getData();推荐精选 Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.parse(path), &q
13、uot;audio/*"); startActivity(intent););private class VideoListAdapter extends BaseAdapterOverridepublic int getCount() return audioLists.size();Overridepublic View getView(int position, View convertView, ViewGroup parent) /把布局文件->View对象View view;ViewHolder holder;if(convertView != null)view
14、= convertView;holder = (ViewHolder) view.getTag();elseview = View.inflate(AudioListActivity.this, R.layout.videolist_item, null);holder = new ViewHolder();holder.iv_icon = (ImageView) view.findViewById(R.id.iv_icon);holder.tv_name = (TextView) view.findViewById(R.id.tv_name);holder.tv_duration = (Te
15、xtView) view.findViewById(R.id.tv_duration);holder.tv_size = (TextView) view.findViewById(R.id.tv_size);view.setTag(holder);/把对应的关系保存起来/得到具体的某一条视频的信息holder.iv_icon.setImageResource(R.drawable.music_default_bg);AudioItem videoItem = audioLists.get(position);holder.tv_name.setText(videoItem.getTitle()
16、;推荐精选/把毫秒转换成:1:20:30这里形式String tiemStr = videoItem.getDuration();if(tiemStr != null)String timeStr = utils.stringForTime(Integer.parseInt(tiemStr);holder.tv_duration.setText(timeStr);String sizeStr = Formatter.formatFileSize(AudioListActivity.this, Long.parseLong(videoItem.getSize();holder.tv_size.s
17、etText(sizeStr);return view;Overridepublic Object getItem(int position) / TODO Auto-generated method stubreturn null;Overridepublic long getItemId(int position) / TODO Auto-generated method stubreturn 0;/容器static class ViewHolderImageView iv_icon;TextView tv_name;TextView tv_duration;TextView tv_siz
18、e;/* * 得到手机里面的视频 媒体扫描器 */private void getVideData() audioLists = new ArrayList<AudioItem>();推荐精选/ 在子线程去得到视频new Thread() public void run() / 查找视频的路径Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;String projection = MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.DURATION,Media
19、Store.Audio.Media.SIZE,MediaStore.Audio.Media.DATA ;Cursor cursor = getContentResolver().query(uri, projection,null, null, null);while(cursor.moveToNext()String duration = cursor.getString(1);/视频总时长int length = Integer.valueOf(duration);if(length > 1000*10)AudioItem videoItem = new AudioItem();St
20、ring title = cursor.getString(0);/标题videoItem.setTitle(title);videoItem.setDuration(duration);String size = cursor.getString(2);/视频文件大小videoItem.setSize(size);String data = cursor.getString(3);/视频在sdcard的绝对路径videoItem.setData(data);audioLists.add(videoItem);cursor.close();handler.sendEmptyMessage(0)
21、;.start();Overridepublic View getContentView() View view = View.inflate(AudioListActivity.this,推荐精选R.layout.activity_audiolist, null);return view;Overridepublic void clickRightButton() Overridepublic void clickLeftButton() / 退出页面finish();02_音乐播放器页面-动画列表<?xml version="1.0" encoding="
22、;utf-8"?><animation-list xmlns:android=" android:oneshot="false" > <item android:drawable="drawable/now_playing_matrix_01" android:duration="150"/> <item android:drawable="drawable/now_playing_matrix_02" android:duration="150&q
23、uot;/> <item android:drawable="drawable/now_playing_matrix_03" android:duration="150"/> <item android:drawable="drawable/now_playing_matrix_04" android:duration="150"/> <item android:drawable="drawable/now_playing_matrix_05" android
24、:duration="150"/> <item android:drawable="drawable/now_playing_matrix_06" android:duration="150"/>推荐精选 <item android:drawable="drawable/now_playing_matrix_07" android:duration="150"/> <item android:drawable="drawable/now_playin
25、g_matrix_08" android:duration="150"/> <item android:drawable="drawable/now_playing_matrix_09" android:duration="150"/></animation-list>播放动画rocketImage = (ImageView) findViewById(R.id.iv_icon);rocketImage.setBackgroundResource(R.drawable.animation_lis
26、t);rocketAnimation = (AnimationDrawable) rocketImage.getBackground();rocketAnimation.start();03_播放页面的完成-40<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent&quo
27、t; android:background="drawable/base_bg" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="+id/iv_icon" android:layout_width="wrap_content" android:layout_height="wrap
28、_content" android:layout_centerHorizontal="true"推荐精选 android:background="drawable/animation_list" /> <TextView android:id="+id/tv_artist" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizon
29、tal="true" android:layout_marginTop="40dip" android:text="演唱者" android:textColor="#ffffff" android:textSize="16sp" /> <TextView android:id="+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_co
30、ntent" android:layout_centerHorizontal="true" android:layout_marginTop="60dip" android:text="歌曲名称" android:textColor="#ffffff" android:textSize="18sp" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" a
31、ndroid:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical" > <TextView android:id="+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gr
32、avity="right" android:layout_marginRight="10dip" android:text="20:11.22" android:textColor="#ffffff" android:textSize="18sp" /> <SeekBar android:id="+id/audio_seekBar" android:layout_width="match_parent" android:layout_heigh
33、t="wrap_content" android:max="100"推荐精选 android:maxHeight="5dip" android:minHeight="5dip" android:progress="10" android:progressDrawable="drawable/music_progress_horizontal" android:thumb="drawable/seek_thumb" /> <LinearLayou
34、t android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:layout_marginBottom="10dip" android:id="+id/btn_shuffle" android:background="drawable/btn_shuffle_order_selector&
35、quot; android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_marginBottom="10dip" android:id="+id/btn_pre" android:background="drawable/btn_pre_audio_selector" android:layout_width="wrap_content&
36、quot; android:layout_height="wrap_content" /> <Button android:layout_marginBottom="10dip" android:id="+id/btn_play_pause" android:background="drawable/btn_pause_audio_selector" android:layout_width="wrap_content" android:layout_height="wra
37、p_content" /> <Button android:layout_marginBottom="10dip" android:id="+id/btn_next" android:background="drawable/btn_next_audio_selector" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:lay
38、out_marginBottom="10dip" android:id="+id/btn_lyric" android:background="drawable/btn_lyric_selector" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>推荐精选</RelativeLayout>
39、04_创建服务MusicPlayerService&和创建对应的aidl文件IMusicPlayerService.aidl-501_回顾服务调用的过程2_创建服务MusicPlayerService.java,基于此类改成IMusicPlayerService.aidl,名字一定要改public class MusicPlayerService extends Service Overridepublic void onCreate() super.onCreate();/* * 根据位置打开一个音频并且播放 * * param position */public void open
40、Audio(int position) /* * 开始播放音频 */推荐精选public void start() /* * 暂停 */public void pause() /* * 停止 */public void stop() /* * 得到歌曲的名称 */public String getAudioName() return ""/* * 得到歌曲演唱者的名字 */public String getArtistName() return ""/* * 得到歌曲的当前播放进度 */public int getCurrentPosition() re
41、turn 0;/* * 得到歌曲的当前总进度 */public int getDuration() return 0;推荐精选/* * 播放下一首歌曲 */public void next() /* * 播放上一首歌曲 */public void pre() /* * 得到播放模式 */public int getPlayMode() return 0;/* * 设置播放模式 */public void setPlayMode(int mode) Overridepublic IBinder onBind(Intent intent) return stub;IMusicPlayerServi
42、ce.Stub stub = new IMusicPlayerService.Stub() MusicPlayerService service = MusicPlayerService.this;Overridepublic void stop() throws RemoteException service.stop();推荐精选Overridepublic void start() throws RemoteException service.start();Overridepublic void setPlayMode(int mode) throws RemoteException
43、service.setPlayMode(mode);Overridepublic void pre() throws RemoteException service.pre();Overridepublic void pause() throws RemoteException service.pause();Overridepublic void openAudio(int position) throws RemoteException service.openAudio(position);Overridepublic void next() throws RemoteException
44、 service.next();Overridepublic int getPlayMode() throws RemoteException / TODO Auto-generated method stubreturn service.getPlayMode();Overridepublic int getDuration() throws RemoteException 推荐精选/ TODO Auto-generated method stubreturn service.getDuration();Overridepublic int getCurrentPosition() thro
45、ws RemoteException / TODO Auto-generated method stubreturn service.getCurrentPosition();Overridepublic String getAudioName() throws RemoteException / TODO Auto-generated method stubreturn service.getAudioName();Overridepublic String getArtistName() throws RemoteException / TODO Auto-generated method
46、 stubreturn service.getArtistName();3_把方法体去掉package com.atguigu.mobileplayer.audio;interface IMusicPlayerService /* * 根据位置打开一个音频并且播放 * param position */ void openAudio(int position);/* * 开始播放音频 */ void start();/*推荐精选 * 暂停 */ void pause();/* * 停止 */ void stop();/* * 得到歌曲的名称 */ String getAudioName();
47、/* * 得到歌曲演唱者的名字 */ String getArtistName(); /* * 得到歌曲的当前播放进度 */ int getCurrentPosition(); /* * 得到歌曲的当前总进度 */ int getDuration(); /* * 播放下一首歌曲 */ void next(); /* * 播放上一首歌曲 */ void pre(); /* * 得到播放模式 */ int getPlayMode(); /* * 设置播放模式 */ void setPlayMode(int mode); 推荐精选05_实现播放一个音乐文件并且设置暂停和播放按钮状态-161_服务中加
48、载音频 Overridepublic void onCreate() super.onCreate();getAudioData();/* * 得到手机里面的视频 媒体扫描器 */private void getAudioData() audioLists = new ArrayList<AudioItem>();/ 在子线程去得到视频new Thread() public void run() / 查找视频的路径Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;String projection = MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.SIZE,MediaStore.Audio.Media.DATA ;Cursor cursor = getContentResolver().query(uri, projection,null, null, null
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年应急管理与灾害响应考试试卷及答案总结
- 2025年新工艺材料技术的研究与应用试题及答案
- 2025年信息安全与风险管理课程考核试卷及答案
- 2025年汽车服务工程职业能力测试试卷及答案
- 2025年批判性思维能力测试题及答案
- 2025年建筑师执业资格考试试卷及答案
- 2025年5G通信技术与网络的性能优化的综合能力考试卷及答案
- 2025年电子商务技能证书考试试题及答案
- 物资采购出库管理制度
- 特困补助资金管理制度
- 水轮机智慧树知到期末考试答案2024年
- 燃烧脂肪-流行健身舞蹈智慧树知到期末考试答案2024年
- 2024年山东省济南市市中区中考二模地理试卷
- (高清版)DZT 0270-2014 地下水监测井建设规范
- 2024中国中车总部招聘笔试参考题库附带答案详解
- 电网防高坠安全教育
- 压铸模具热处理
- 20221011锂电池行业数字化转型MES整体解决方案
- TDT 1070.1-2022 矿山生态修复技术规范 第1部分:通则
- 高校学科建设与发展规划
- 2024年大学试题(教育学)-教育学原理历年考试高频考点试题附带答案
评论
0/150
提交评论