手機影音第七天 視頻的播放下一個視頻功能實現,視頻進度、電量變化的實現

來源:互聯網
上載者:User

標籤:播放器頁面電量變化   視頻進度變化   播放上一個、下一個與序列化實體類 等功能實現   

先看下:

    650) this.width=650;" src="https://s1.51cto.com/wyfs02/M02/9C/46/wKiom1luKMDAU8mZAAB6leNHsZ4773.jpg-wh_500x0-wm_3-wmp_4-s_3245740799.jpg" title="QQ圖片20170718232530.jpg" alt="wKiom1luKMDAU8mZAAB6leNHsZ4773.jpg-wh_50" />

在這裡,視頻進度條會根據視頻播放變化,下方的按鈕中,播放下一個,上一個都已實現。

代碼已經託管到碼雲上,想下載看的小夥伴可以從下方地址中擷取

    https://git.oschina.net/joy_yuan/MobilePlayer


1、在這張圖上,自訂的顯示電量的那一列已經被系統內建的狀態列遮蓋,下面就說一下實現方法:

    系統電量變化時,系統會發送一個廣播,所有對這個廣播感興趣的activity都可以註冊廣播來接收這個廣播。在這裡接收系統電量變化,螢幕鎖屏、開屏的廣播,只能使用動態廣播,不能用靜態廣播,這樣是防止在鎖屏後,某些程式偷偷幹事情,開屏後其又隱藏,導致使用者不知道。

    定義動態廣播接收到系統的電量變化廣播後,就根據電量值的區間,來動態切換電量的圖片,具體程式碼片段如下:

//註冊電量廣播,像鎖屏、開屏、電量變化這樣的廣播,靜態註冊的廣播接收者收不到廣播,因為導致安全問題,所以必須動態註冊receiver=new MyReceiver();IntentFilter intentFilter=new IntentFilter();//當電量變化時發這個廣播intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);registerReceiver(receiver, intentFilter);---------------------------------------------------------------------------------------/** * 監聽電量變化的廣播接收者 */class MyReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent) {        int level=intent.getIntExtra("level",0);  //去intent擷取key為level的值,預設是0        setBattery(level);    }}

接收到電量的區間後,來動態設定電量圖片

/** * 電量變化的方法 * @param level */private void setBattery(int level) {    if (level<=0){        ivBattery.setImageResource(R.drawable.ic_battery_0);    }else if (level<=10){        ivBattery.setImageResource(R.drawable.ic_battery_10);    }else if (level<=20){        ivBattery.setImageResource(R.drawable.ic_battery_20);    }else if (level<=40){        ivBattery.setImageResource(R.drawable.ic_battery_40);    }else if (level<60){        ivBattery.setImageResource(R.drawable.ic_battery_60);    }else if (level<=80){        ivBattery.setImageResource(R.drawable.ic_battery_80);    }else if (level<=100){        ivBattery.setImageResource(R.drawable.ic_battery_100);    }}


2、視頻進度條的變化

    seekbar本身有一個setMax();這個是設定seekbar的最大值,我們傳入一個視頻的總時間長度就可以。在開始播放視頻時,傳一個空的handler,來進行更新seekbar方法。

    

/** * 準備好播放時的監聽 */class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {        @Override    public void onPrepared(MediaPlayer mp) {        videoview.start(); //開始播放        duration = videoview.getDuration();  //擷取視頻總時間長度        seekbarVideo.setMax(duration);   //設定播放進度的最大值        //發送訊息,來更新視頻進度        handler.sendEmptyMessage(PROGRESS);    }}

然後在handler裡,根據handler的what類型,來做更新進度的操作。videoview.getcurrentPosition()方法擷取當前的視頻進度,然後seekbar有個setpositon()可以設定進度,最後每隔一秒,再發送一個handler來更新這個進度

    

/** * 定義一個handler來處理資訊 */public Handler handler=new Handler(){    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        switch (msg.what){            case PROGRESS:                //根據準備好播放時候後,發送的更新視頻進度訊息,來更新視頻進度                int currentPosition=videoview.getCurrentPosition();                seekbarVideo.setProgress(currentPosition);                //隔一秒重新整理一下進度                removeMessages(PROGRESS);                handler.sendEmptyMessageDelayed(PROGRESS,1000);                break;        }    }};


3、系統時間的變化:

        在上一面中講到了視頻進度條變換時,用到了handler,在handler裡隔一秒重新整理下handler,因此在這裡也是更新系統時間放到了handler裡。

    

/** * 定義一個handler來處理資訊 */public Handler handler=new Handler(){    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        switch (msg.what){            case PROGRESS:                //根據準備好播放時候後,發送的更新視頻進度訊息,來更新視頻進度                int currentPosition=videoview.getCurrentPosition();                seekbarVideo.setProgress(currentPosition);                //設定當前播放的時間,使其顯示在播放器上                tvCurrentTime.setText(utils.stringForTime(currentPosition));                //設定系統播放時間,隔一秒重新整理一下                tvSystemTime.setText(getSystemTime());                //隔一秒重新整理一下進度                removeMessages(PROGRESS);                handler.sendEmptyMessageDelayed(PROGRESS,1000);                break;        }    }};/** * 擷取系統時間 * @return */private String getSystemTime() {    SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss", Locale.getDefault());    return format.format(new Date());}

    在這裡要注意的是,擷取系統時間的方法,用的那個SimpleDateFormat()方法,它的包是java.text.SimpleDateFormat;一定要注意了,Android系統可能會自動給我們導成其他包導致報錯


4、要實現播放上一個下一個視頻功能,我們就要擷取視頻資料的列表list,那麼在videoPager中我們通過bundle,將list寫入到bundle中,其中要注意的是 一定要給實體類MediaItem 序列化,即類實現Serializable介面即可,否則會導致報錯。

    在videoPager中,按如下代碼傳入list到intent

//給對象序列化後傳到SystemVideoPlayer中Intent intent=new Intent(context, SystemVideoPlayer.class);Bundle bundle=new Bundle();bundle.putSerializable("mediallist",(ArrayList<MediaItem>)mediaList);intent.putExtras(bundle);intent.putExtra("position",position);  //將點擊的視頻的位置傳過去,方便定位播放的是哪個視頻context.startActivity(intent);

    在SystemVideoPlayer類中擷取該list

    

//擷取videopager裡傳過來的list資料,包含media列表的資訊medialist = (ArrayList<MediaItem>) getIntent().getSerializableExtra("mediallist");position = getIntent().getIntExtra("position",0);


擷取到list和position後,即可非常方便的實現播放上一個,下一個視頻

public void onClick(View v) {    if ( v == btnVoice ) {        // Handle clicks for btnVoice    } else if ( v == switchPlayer ) {        // Handle clicks for switchPlayer    } else if ( v == btExit ) {        // Handle clicks for btExit   退出        finish();    } else if ( v == btVideoPre ) {        // Handle clicks for btVideoPre  播放上一個視頻        if (medialist!=null&&medialist.size()>0){            position-=1;            if (position<=0){                position=medialist.size()-1;            }            MediaItem mediaitem=medialist.get(position);            tvName.setText(mediaitem.getName());            videoview.setVideoPath(mediaitem.getData());        }else if (uri!=null){            tvName.setText(uri.toString());            videoview.setVideoURI(uri);        }    } else if ( v == btVideoStartPause ) {        // Handle clicks for btVideoStartPause  播放暫停與啟動        if (videoview.isPlaying()){            //視頻在播放,則暫停            videoview.pause();            //按鈕圖片設定為暫停            btVideoStartPause.setBackgroundResource(R.drawable.bt_video_play_selector);        }else{            //視頻在暫停,設定為播放            videoview.start();            //按鈕圖片設定為播放            btVideoStartPause.setBackgroundResource(R.drawable.bt_video_pause_selector);            }    } else if ( v == btNext ) {        // Handle clicks for btNext   播放下一個     if (medialist!=null&&medialist.size()>0){         position+=1;         if (position>=medialist.size()){             position=0;         }             MediaItem mediaItem = medialist.get(position);             tvName.setText(mediaItem.getName());             videoview.setVideoPath(mediaItem.getData());     }else if (uri!=null){         //把上一個下一個按鈕設定灰色         tvName.setText(uri.toString());         videoview.setVideoURI(uri);         btNext.setEnabled(false);         btNext.setBackgroundResource(R.drawable.btn_next_gray);     }    } else if ( v == btVideoSwitchScreen ) {        // Handle clicks for btVideoSwitchScreen    }}

這裡做的是迴圈播放,即播放至最後一個後,按下一個,會播放第一個視頻。

本文出自 “YuanGuShi” 部落格,請務必保留此出處http://cm0425.blog.51cto.com/10819451/1948770

手機影音第七天 視頻的播放下一個視頻功能實現,視頻進度、電量變化的實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.