尚硅谷-楊光福-手機(jī)影音day3_第1頁(yè)
尚硅谷-楊光福-手機(jī)影音day3_第2頁(yè)
尚硅谷-楊光福-手機(jī)影音day3_第3頁(yè)
尚硅谷-楊光福-手機(jī)影音day3_第4頁(yè)
尚硅谷-楊光福-手機(jī)影音day3_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、321影音 講師:楊光福 微博:22_當(dāng)萬(wàn)能播放器播放失敗的時(shí)候提示用戶(hù)&點(diǎn)擊確定的時(shí)候退出播放器-111_當(dāng)播放出錯(cuò)回調(diào)videoview.setOnErrorListener(new OnErrorListener() Overridepublic boolean onError(MediaPlayer mp, int what, int extra) /Toast.makeText(getApplicationContext(), "視頻播放出錯(cuò)", 1).show();/1.提示用戶(hù)-基本做法/什么情況導(dǎo)致播放失敗/a,播放過(guò)程中沒(méi)有網(wǎng)絡(luò);-重試/b,播放一

2、個(gè)不支持的格式(一進(jìn)來(lái)就報(bào)錯(cuò))-用萬(wàn)能播放器/c,下載視頻的時(shí)候中間有空白-無(wú)法解決 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_系統(tǒng)播放器和萬(wàn)能播放器手動(dòng)切換相關(guān)處理-291_系統(tǒng)播放器和萬(wàn)能播放器手動(dòng)切換case R.id.btn_switch: new AlertDialog.Builder(VideoPlayerActivity.this) .setMessage("當(dāng)前是系統(tǒng)播放器,是否要切換萬(wàn)能播放器播放") .setNegativeButton("下次再說(shuō)", null) .setPositiveButton("立刻切換", new DialogInterface.OnClickL

4、istener() public void onClick(DialogInterface dialog, int whichButton) /退出播放器 startVitamioPlyer(); ) .setCancelable(false) .show();break;/* * 設(shè)置標(biāo)題和播放數(shù)據(jù) */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_支持播放網(wǎng)絡(luò)視頻有緩沖效果/* * 判斷是否是網(wǎng)絡(luò)資源 * 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)/設(shè)置緩存-針對(duì)的網(wǎng)絡(luò)視頻/設(shè)置緩中進(jìn)度-到那個(gè)等分

7、int buffer = videoview.getBufferPercentage();/0100;/要緩沖多少int totalBuffer = buffer * video_seekBar.getMax();/得到緩存的進(jìn)度 int secondaryProgress = totalBuffer / 100;推薦精選 video_seekBar.setSecondaryProgress(secondaryProgress);elsevideo_seekBar.setSecondaryProgress(0);3_屏蔽系統(tǒng)播放器和Vitamio播放器切換的動(dòng)畫(huà)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();/關(guān)閉播放器break;04_音樂(lè)播放器推薦精選01_基于視頻列表修改成音樂(lè)列表-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("本地音樂(lè)");setRightButton(View.GONE);utils = new Utils();lv_audio_list = (ListView) findViewById(R.id.lv_audio_list);tv_noaudio = (TextView) findViewById(R.id.tv_noaudio);/ 得到手機(jī)的視頻getVideData();lv_audio_list.setOnItemClickListener(new On

12、ItemClickListener() Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) /點(diǎn)擊的時(shí)候只傳播放地址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對(duì)象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);/把對(duì)應(yīng)的關(guān)系保存起來(lái)/得到具體的某一條視頻的信息holder.iv_icon.setImageResource(R.drawable.music_default_bg);AudioItem videoItem = audioLists.get(position);holder.tv_name.setText(videoItem.getTitle()

16、;推薦精選/把毫秒轉(zhuǎn)換成: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;/* * 得到手機(jī)里面的視頻 媒體掃描器 */private void getVideData() audioLists = new ArrayList<AudioItem>();推薦精選/ 在子線(xiàn)程去得到視頻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);/視頻總時(shí)長(zhǎng)int length = Integer.valueOf(duration);if(length > 1000*10)AudioItem videoItem = new AudioItem();St

20、ring title = cursor.getString(0);/標(biāo)題videoItem.setTitle(title);videoItem.setDuration(duration);String size = cursor.getString(2);/視頻文件大小videoItem.setSize(size);String data = cursor.getString(3);/視頻在sdcard的絕對(duì)路徑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() / 退出頁(yè)面finish();02_音樂(lè)播放器頁(yè)面-動(dòng)畫(huà)列表<?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>播放動(dòng)畫(huà)rocketImage = (ImageView) findViewById(R.id.iv_icon);rocketImage.setBackgroundResource(R.drawable.animation_lis

26、t);rocketAnimation = (AnimationDrawable) rocketImage.getBackground();rocketAnimation.start();03_播放頁(yè)面的完成-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="歌曲名稱(chēng)" 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_創(chuàng)建服務(wù)MusicPlayerService&和創(chuàng)建對(duì)應(yīng)的aidl文件IMusicPlayerService.aidl-501_回顧服務(wù)調(diào)用的過(guò)程2_創(chuàng)建服務(wù)MusicPlayerService.java,基于此類(lèi)改成IMusicPlayerService.aidl,名字一定要改public class MusicPlayerService extends Service Overridepublic void onCreate() super.onCreate();/* * 根據(jù)位置打開(kāi)一個(gè)音頻并且播放 * * param position */public void open

40、Audio(int position) /* * 開(kāi)始播放音頻 */推薦精選public void start() /* * 暫停 */public void pause() /* * 停止 */public void stop() /* * 得到歌曲的名稱(chēng) */public String getAudioName() return ""/* * 得到歌曲演唱者的名字 */public String getArtistName() return ""/* * 得到歌曲的當(dāng)前播放進(jìn)度 */public int getCurrentPosition() re

41、turn 0;/* * 得到歌曲的當(dāng)前總進(jìn)度 */public int getDuration() return 0;推薦精選/* * 播放下一首歌曲 */public void next() /* * 播放上一首歌曲 */public void pre() /* * 得到播放模式 */public int getPlayMode() return 0;/* * 設(shè)置播放模式 */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 /* * 根據(jù)位置打開(kāi)一個(gè)音頻并且播放 * param position */ void openAudio(int position);/* * 開(kāi)始播放音頻 */ void start();/*推薦精選 * 暫停 */ void pause();/* * 停止 */ void stop();/* * 得到歌曲的名稱(chēng) */ String getAudioName();

47、/* * 得到歌曲演唱者的名字 */ String getArtistName(); /* * 得到歌曲的當(dāng)前播放進(jìn)度 */ int getCurrentPosition(); /* * 得到歌曲的當(dāng)前總進(jìn)度 */ int getDuration(); /* * 播放下一首歌曲 */ void next(); /* * 播放上一首歌曲 */ void pre(); /* * 得到播放模式 */ int getPlayMode(); /* * 設(shè)置播放模式 */ void setPlayMode(int mode); 推薦精選05_實(shí)現(xiàn)播放一個(gè)音樂(lè)文件并且設(shè)置暫停和播放按鈕狀態(tài)-161_服務(wù)中加

48、載音頻 Overridepublic void onCreate() super.onCreate();getAudioData();/* * 得到手機(jī)里面的視頻 媒體掃描器 */private void getAudioData() audioLists = new ArrayList<AudioItem>();/ 在子線(xiàn)程去得到視頻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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論