尚硅谷杨光福手机影音day_第1页
尚硅谷杨光福手机影音day_第2页
尚硅谷杨光福手机影音day_第3页
尚硅谷杨光福手机影音day_第4页
尚硅谷杨光福手机影音day_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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.OnClickListe

4、ner() 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.setTex

5、t(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 */public bo

6、olean 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)/设置缓存-针对的网络视频/设置缓中进度-到那个等分int buff

7、er = 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 目录下<?xml version

8、="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中 case FINISH:if(

9、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 handler = new H

10、andler()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 savedInstanceState) supe

11、r.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 OnItemClickListene

12、r() 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), "audio/*");

13、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 = convertView;holder

14、 = (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 = (TextView) view.findVie

15、wById(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();/把毫秒转换成:1:20:30这里形式

16、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.setText(sizeStr);return v

17、iew;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_size;/* * 得到手机里面的视频 媒体扫描器 *

18、/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,MediaStore.Audio.Media.SIZE,Media

19、Store.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();String title = cursor.getStrin

20、g(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);.start();Overridepublic Vie

21、w 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="utf-8"?><animation-l

22、ist 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"/> <item android:drawa

23、ble="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:duration="150"/> &

24、lt;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_playing_matrix_08" android:duration=&

25、quot;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_list);rocketAnimation = (AnimationDrawa

26、ble) 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" android:background="drawable

27、/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_content" android:layout_center

28、Horizontal="true" android:background="drawable/animation_list" /> <TextView android:id="+id/tv_artist" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marg

29、inTop="40dip" android:text="演唱者" android:textColor="#ffffff" android:textSize="16sp" /> <TextView android:id="+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizon

30、tal="true" android:layout_marginTop="60dip" android:text="歌曲名称" android:textColor="#ffffff" android:textSize="18sp" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content&

31、quot; 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_gravity="right" android:layout_m

32、arginRight="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_height="wrap_content" android:max=&

33、quot;100" android:maxHeight="5dip" android:minHeight="5dip" android:progress="10" android:progressDrawable="drawable/music_progress_horizontal" android:thumb="drawable/seek_thumb" /> <LinearLayout android:layout_width="match_parent&qu

34、ot; 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" android:layout_width="wrap_conten

35、t" 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" android:layout_height="wrap_conte

36、nt" /> <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="wrap_content" /> <Button android:lay

37、out_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:layout_marginBottom="10dip" android:i

38、d="+id/btn_lyric" android:background="drawable/btn_lyric_selector" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout></RelativeLayout>04_创建服务MusicPlayerService&和创建对应的aidl文件IMusic

39、PlayerService.aidl-501_回顾服务调用的过程2_创建服务MusicPlayerService.java,基于此类改成IMusicPlayerService.aidl,名字一定要改public class MusicPlayerService extends Service Overridepublic void onCreate() super.onCreate();/* * 根据位置打开一个音频并且播放 * * param position */public void openAudio(int position) /* * 开始播放音频 */public void st

40、art() /* * 暂停 */public void pause() /* * 停止 */public void stop() /* * 得到歌曲的名称 */public String getAudioName() return ""/* * 得到歌曲演唱者的名字 */public String getArtistName() return ""/* * 得到歌曲的当前播放进度 */public int getCurrentPosition() return 0;/* * 得到歌曲的当前总进度 */public int getDuration() re

41、turn 0;/* * 播放下一首歌曲 */public void next() /* * 播放上一首歌曲 */public void pre() /* * 得到播放模式 */public int getPlayMode() return 0;/* * 设置播放模式 */public void setPlayMode(int mode) Overridepublic IBinder onBind(Intent intent) return stub;IMusicPlayerService.Stub stub = new IMusicPlayerService.Stub() MusicPlaye

42、rService service = MusicPlayerService.this;Overridepublic void stop() throws RemoteException service.stop();Overridepublic void start() throws RemoteException service.start();Overridepublic void setPlayMode(int mode) throws RemoteException service.setPlayMode(mode);Overridepublic void pre() throws R

43、emoteException service.pre();Overridepublic void pause() throws RemoteException service.pause();Overridepublic void openAudio(int position) throws RemoteException service.openAudio(position);Overridepublic void next() throws RemoteException service.next();Overridepublic int getPlayMode() throws Remo

44、teException / TODO Auto-generated method stubreturn service.getPlayMode();Overridepublic int getDuration() throws RemoteException / TODO Auto-generated method stubreturn service.getDuration();Overridepublic int getCurrentPosition() throws RemoteException / TODO Auto-generated method stubreturn servi

45、ce.getCurrentPosition();Overridepublic String getAudioName() throws RemoteException / TODO Auto-generated method stubreturn service.getAudioName();Overridepublic String getArtistName() throws RemoteException / TODO Auto-generated method stubreturn service.getArtistName();3_把方法体去掉package com.atguigu.

46、mobileplayer.audio;interface IMusicPlayerService /* * 根据位置打开一个音频并且播放 * param position */ void openAudio(int position);/* * 开始播放音频 */ void start();/* * 暂停 */ void pause();/* * 停止 */ void stop();/* * 得到歌曲的名称 */ String getAudioName(); /* * 得到歌曲演唱者的名字 */ String getArtistName(); /* * 得到歌曲的当前播放进度 */ int g

47、etCurrentPosition(); /* * 得到歌曲的当前总进度 */ int getDuration(); /* * 播放下一首歌曲 */ void next(); /* * 播放上一首歌曲 */ void pre(); /* * 得到播放模式 */ int getPlayMode(); /* * 设置播放模式 */ void setPlayMode(int mode); 05_实现播放一个音乐文件并且设置暂停和播放按钮状态-161_服务中加载音频 Overridepublic void onCreate() super.onCreate();getAudioData();/* *

48、得到手机里面的视频 媒体扫描器 */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);while (cursor.moveToNext() String duration = cursor.getString(1);/ 视频总时长int length = Integer.valueOf(duration);if (length > 1000 *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论