视频列表:
package com.multimedia.video;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.multimedia.entity.R;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
/**
* 播放列表界面
* @author Andy
*
*/
public class VideoListActivity extends ListActivity {
private int index=0;
private Cursor cursor=null;
private List<String> videoMsg=new ArrayList<String>();
private ArrayList<Map<String,Object>> videoData= new ArrayList<Map<String,Object>>();;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean able=Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
if(able)
getAllvideoMsg();
else
Toast.makeText(this, "sd card is unable", Toast.LENGTH_SHORT).show();
}
/**
* 获取本地视频信息
*/
private void getAllvideoMsg(){
Uri Media_URL = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
cursor = this.getContentResolver().query(Media_URL, VideoData.listMsg, "duration>5000", null, null);
int len=cursor.getCount();
while(index<len){
String info = getInfoByPosition(cursor, index);
videoMsg.add(info);//Log.e("msg", ""+VideoData.mCursorCols[index]);
index++;
}
for(int i =0; i < len; i++) {
Map<String,Object> item = new HashMap<String,Object>();
item.put("image", R.drawable.vp);
item.put("title", videoMsg.get(i));
// item.put("text", mListStr[i]);
videoData.add(item);
}
SimpleAdapter adapter = new SimpleAdapter(this,videoData,R.layout.videolist,
new String[]{"image","title"},new int[]{R.id.videoimage,R.id.videotitle});
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent=new Intent(this,VideoActivity.class);
Bundle data=new Bundle();
data.putInt("video_index", position);
intent.putExtra("video_bundle", data);
startActivity(intent);
super.onListItemClick(l, v, position, id);
}
private String getInfoByPosition(Cursor c,int position){
c.moveToPosition(position);
int videoTitle= c.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME);
int videoSize=c.getColumnIndex(MediaStore.Video.Media.SIZE);
int sizes=Integer.parseInt(c.getString(videoSize))/1024/1024;
int TotalTime=c.getColumnIndex(MediaStore.Video.Media.DURATION);
int time=Integer.parseInt(c.getString(TotalTime));
int min=time/1000/60;
int sec=time/1000%60;
String info =c.getString(videoTitle)+'\n'+sizes+"MB"+" "+min+"'"+sec;
return info;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, Menu.FIRST, 0, "选择其他播放器");
menu.add(0, Menu.FIRST+1, 0, "播放设置");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==1){
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setType("video/*");
startActivity(Intent.createChooser(intent, getTitle()));
}
else if(item.getItemId()==2){
this.startActivity(new Intent(this,SetActivity.class));
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy() {
if(cursor!=null){
cursor.close();
cursor=null;
}
super.onDestroy();
}
}
过滤信息选择
package com.multimedia.video;
import android.provider.MediaStore;
public class VideoData {
/**
* 选择性的返回列表信息
*/
final static String[] listMsg = new String[] {
// "video._id AS _id", // index must match IDCOLIDX below
MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.SIZE,
MediaStore.Video.Media.DURATION
};
final static String[] showMsg = new String[] {
// "video._id AS _id", // index must match IDCOLIDX below
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.DISPLAY_NAME
};
static int index=0;
}
播放界面
package com.multimedia.video;
import com.multimedia.entity.R;
import com.multimedia.entity.R.id;
import com.multimedia.entity.R.layout;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.SeekBar;
public class VideoActivity extends Activity {
@Override
protected void onNewIntent(Intent intent) {Log.e("msg", "newintent");
/*Uri uri=intent.getData();
cursor = this.getContentResolver().query(uri, VideoData.showMsg, "duration>2000", null, null);
super.onNewIntent(intent);*/
}
private SurfaceView sfv;
private SeekBar seekbar;
private Button btstart,btstop,btnext,btprev,btpause,btresume;//
private VideoPlayer myvideo;
//控件是否可见
boolean cansee=true;
Cursor cursor=null;
int current_index=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);*/
setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
setContentView(R.layout.videoplayer);
getview();
Bundle b=getIntent().getBundleExtra("video_bundle");
if(b!=null){
Uri Media_URL = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
cursor = this.getContentResolver().query(Media_URL, VideoData.showMsg, "duration>5000", null, null);
current_index=b.getInt("video_index");
}else{
String addres=getIntent().getData().toString();
Uri uri=Uri.parse(addres.substring(addres.indexOf("/sdcard"), addres.length()));Log.e("msg", "uri="+uri);
cursor = this.getContentResolver().query(uri, VideoData.showMsg, "duration>2000", null, null);
}
}
/**
* 获取控件对象
*/
private void getview(){
ClickMonitor cliM=new ClickMonitor();
sfv=(SurfaceView)findViewById(R.id.surfaceView1);
seekbar=(SeekBar)findViewById(R.id.seekbar);
btprev=(Button)findViewById(R.id.btnPrev);
btprev.setOnClickListener(cliM);
btstart=(Button)findViewById(R.id.btnPlay);
btstart.setOnClickListener(cliM);
btstart.setVisibility(View.GONE);
btpause=(Button)findViewById(R.id.btnPause);
// btpause.setVisibility(View.GONE);
btpause.setOnClickListener(cliM);
btresume=(Button)findViewById(R.id.btnResume);
btresume.setVisibility(View.GONE);
btresume.setOnClickListener(cliM);
btstop=(Button)findViewById(R.id.btnStop);
btstop.setOnClickListener(cliM);
btnext=(Button)findViewById(R.id.btnNext);
btnext.setOnClickListener(cliM);
myvideo=new VideoPlayer(getApplicationContext(), sfv,seekbar,this);
seekbar.setOnSeekBarChangeListener(new SeekBarMonitor());
}
/**
* 设置控件可见度
* @param view
*/
void setVisibleWidget(int view){
if(view==View.GONE){
seekbar.setVisibility(view);
btnext.setVisibility(view);
btprev.setVisibility(view);
btpause.setVisibility(view);
btresume.setVisibility(view);
btstart.setVisibility(view);
btstop.setVisibility(view);
}
else{
if(myvideo.isPlaying()){
seekbar.setVisibility(view);
btnext.setVisibility(view);
btpause.setVisibility(view);//pause enable
btprev.setVisibility(view);
btstop.setVisibility(view);
}else if(true==myvideo.hasstop){
seekbar.setVisibility(view);
btnext.setVisibility(view);
btprev.setVisibility(view);
btstart.setVisibility(view);//start enable
btstop.setVisibility(view);
}else if(false==myvideo.hasstop){
seekbar.setVisibility(view);
btnext.setVisibility(view);
btprev.setVisibility(view);
btresume.setVisibility(view);//resume enable
btstop.setVisibility(view);
}
}
}
@Override
protected void onStart() {Log.e("msg", "onstart");
super.onStart();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
myvideo.destroy();
super.onDestroy();
}
void contrlVisible(){
if(cansee)
setVisibleWidget(View.VISIBLE);
else
setVisibleWidget(View.GONE);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action =event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
cansee=!cansee;
contrlVisible();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return super.onTouchEvent(event);
}
class ClickMonitor implements View.OnClickListener{
@Override
public void onClick(View v) {
if(v==btstart){
myvideo.startPlay();
btstart.setVisibility(View.GONE);
btpause.setVisibility(View.VISIBLE);
btresume.setVisibility(View.GONE);
}
else if(v==btpause){
myvideo.pause();
btstart.setVisibility(View.GONE);
btpause.setVisibility(View.GONE);
btresume.setVisibility(View.VISIBLE);
}
else if(v==btstop){
myvideo.stop();
btstart.setVisibility(View.VISIBLE);
btpause.setVisibility(View.GONE);
btresume.setVisibility(View.GONE);
}
else if(v==btresume){
myvideo.resume();
btstart.setVisibility(View.GONE);
btpause.setVisibility(View.VISIBLE);
btresume.setVisibility(View.GONE);
}
else if(v==btnext){
myvideo.next();
btstart.setVisibility(View.GONE);
btpause.setVisibility(View.VISIBLE);
btresume.setVisibility(View.GONE);
}
else if(v==btprev){
myvideo.previous();
btstart.setVisibility(View.GONE);
btpause.setVisibility(View.VISIBLE);
btresume.setVisibility(View.GONE);
}
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// int type = this.getResources().getConfiguration().orientation;
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//切换到了横屏
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//切换到了竖屏
}
super.onConfigurationChanged(newConfig);
}
class SeekBarMonitor implements SeekBar.OnSeekBarChangeListener{
int currentpos;
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
currentpos=progress * myvideo.myplayer.getDuration() / seekBar.getMax();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
myvideo.myplayer.seekTo(currentpos);
}
}
}
播放控制
package com.multimedia.video;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.database.Cursor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.provider.MediaStore;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.SeekBar;
import android.widget.Toast;
import android.widget.VideoView;
public class VideoPlayer implements OnBufferingUpdateListener,
OnCompletionListener, MediaPlayer.OnPreparedListener,
Callback,OnErrorListener{
public static final int UPDATE=1;
public static final int VISIBLE=2;
private int video_w,video_h;
private SurfaceHolder sfh;
private SurfaceView sfv;
protected MediaPlayer myplayer;
private SeekBar seekbar;
private Timer timer=new Timer();
private MyTask task;
private boolean desroyed=false;//canvas desroy
private Context mcontext;
private VideoActivity vida;
//控制可见性,
public boolean hasstop=false,pausing=false;
private int count=0;
private int current_pos,total_time ;
public VideoPlayer(Context mcontext,SurfaceView sfv,SeekBar seekbar,VideoActivity vida){
this.mcontext=mcontext;
this.vida=vida;
this.sfv=sfv;
this.seekbar=seekbar;
this.sfv.setFocusable(true);
sfh=this.sfv.getHolder();
sfh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
sfh.setKeepScreenOn(true);
sfh.addCallback(this);
task=new MyTask();
timer.schedule(task, 0, 1000);
myplayer = new MediaPlayer();
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case VISIBLE:
vida.cansee=false;
vida.contrlVisible();
break;
case UPDATE:
current_pos = myplayer.getCurrentPosition();
total_time = myplayer.getDuration();
if (total_time > 0) {
int pos = seekbar.getMax() * current_pos / total_time;
seekbar.setProgress(pos);
}
break;
}
};
};
@Override
public void surfaceCreated(SurfaceHolder holder) {
playStart();
Log.e("msg", "surfaceCreated");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.e("msg", "surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
desroyed=true;
if(myplayer!=null&&myplayer.isPlaying()){
myplayer.stop();
}
Log.e("msg", "surfaceDestroyed");
}
private void playStart(){
String path=getDateByPosition(vida.cursor, vida.current_index);
Toast.makeText(mcontext, getInfoByPosition(vida.cursor, vida.current_index), Toast.LENGTH_SHORT).show();
try {
hasstop=false;
seekbar.setEnabled(true);
myplayer.reset();
myplayer.setDataSource(path);
myplayer.setScreenOnWhilePlaying(true);
myplayer.setDisplay(sfh);
myplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
myplayer.setWakeMode(mcontext, PowerManager.PARTIAL_WAKE_LOCK);
myplayer.setOnPreparedListener(this);
myplayer.setOnCompletionListener(this);
myplayer.setOnBufferingUpdateListener(this);
myplayer.setOnErrorListener(this);
myplayer.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void startPlay(){
playStart();
myplayer.start();
}
public void resume(){
if(!myplayer.isPlaying()){
pausing=false;
myplayer.start();
if(desroyed){
desroyed=false;
myplayer.seekTo(current_pos);
}
}
}
public void pause(){
if(myplayer.isPlaying()){
pausing=true;
myplayer.pause();
}
}
public void stop(){
current_pos=0;total_time=0;
if (myplayer != null) {
pausing=true;
hasstop=true;
myplayer.stop();
seekbar.setProgress(0);
seekbar.setEnabled(false);
}
}
public void setLooop(boolean loop){
myplayer.setLooping(loop);
}
public boolean isPlaying(){
return myplayer.isPlaying();
}
public void previous() {
if (vida.current_index == 0) {
vida.current_index = vida.cursor.getCount() - 1;
} else {
vida.current_index--;
}
current_pos=0;total_time=0;
pausing=false;
playStart();
}
public void next() {
if (vida.current_index == vida.cursor.getCount() - 1) {
vida.current_index = 0;
} else {
vida.current_index++;
}
current_pos=0;total_time=0;
pausing=false;
playStart();
}
private String getDateByPosition(Cursor c,int position){
c.moveToPosition(position);
int dataColumn = c.getColumnIndex(MediaStore.Video.Media.DATA);
String data = c.getString(dataColumn);
return data;
}
private String getInfoByPosition(Cursor c,int position){
c.moveToPosition(position);
int videoTitle= c.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME);
String info =c.getString(videoTitle);
return info;
}
public void destroy(){
if(myplayer!=null){
myplayer.stop();
myplayer.release();
myplayer = null;
}
if(vida.cursor!=null){
vida.cursor.close();
vida.cursor=null;
}
if(timer!=null){
timer.cancel();
task.cancel();
timer=null;
task=null;
}
}
public void controlVolume(){
AudioManager amg=(AudioManager)this.mcontext.getSystemService(Context.AUDIO_SERVICE);
float current_volume=amg.getStreamVolume(AudioManager.STREAM_MUSIC);
float max_volume=amg.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume=current_volume/max_volume;
myplayer.setVolume(volume, volume);
}
private class MyTask extends TimerTask{
@Override
public void run() {
if(myplayer==null)
return;
if(myplayer.isPlaying()&&seekbar.isPressed()==false){
Message msg=Message.obtain();
msg.what=UPDATE;
handler.sendMessage(msg);
}
if(vida.cansee){
count++;
if(count%5==0){
count=0;
Message msg=Message.obtain();
msg.what=VISIBLE;
handler.sendMessage(msg);
}
}
}
}
@Override
public void onPrepared(MediaPlayer mp) {
video_w=myplayer.getVideoWidth();
video_h=myplayer.getVideoHeight();
if(video_w!=0&&video_h!=0){
if(!pausing){
sfh.setFixedSize(video_w,video_h);
myplayer.start();
if(current_pos>0)
myplayer.seekTo(current_pos);
}
}
Log.e("msg", "prepare");
}
@Override
public void onCompletion(MediaPlayer mp) {
if(myplayer.isLooping())
playStart();
else
next();
Log.e("msg", "complete");
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
seekbar.setSecondaryProgress(percent);
Log.e("msg", "buffer");
}
@Override
public boolean onError(MediaPlayer mp, int arg1, int arg2) {
destroy();
return false;
}
}