多媒体是计算机和视频技术的结合,实际上它是两个媒体:声音和图像
音乐播放器
显示播放列表
查询手机外部卡里面的所有歌曲
在此我们运用到了AsyncQueryHandler 这样安全性更高
点击歌曲条目得到歌曲的详细信息,用意图带参数传入播放界面。
播放界面
在播放界面我们使用到了SeekBar控件(可拖动进度条),
在歌曲播放的同时我们要进行进度条进度的同步,我们使用了
mHandler.post(new MyTask());线程内修改当前进度
然后mHandler.postDelayed(this,200);自己不段的调用自己
这样就做到一个进度条更新进度的效果,如果要实现拖动进度条改变
播放位置设置进度条的 seekBar.setOnSeekBarChangeListener(this);
自动重写
// 拖动事件
onProgressChanged(SeekBarseekBar, int progress,boolean fromUser)
// 开始拖动
onStartTrackingTouch(SeekBarseekBar)
// 拖动结束
onStopTrackingTouch(SeekBarseekBar)
我们在拖动结束可以得到进度条的进度值,然而通过进度值设置歌曲的播放位置即可,实现
拖动进度条改变播放位置的效果。
public classMainActivity extends Activity {
private ListView lv;
private MyAdapter adapter;
/** Called when the activity is firstcreated. */
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView) findViewById(R.id.lv);
adapter = new MyAdapter(this, null);
lv.setAdapter(adapter);
startQuery();
// 设置listview点击事件
lv.setOnItemClickListener(newMyOnItemClickListener());
}
private class MyOnItemClickListenerimplements OnItemClickListener{
@Override
publicvoid onItemClick(AdapterView<?> parent, View view, int position,
longid) {
// TODO Auto-generated method stub
Intent intent = newIntent(getApplicationContext(),MediePlayingActivity.class);
Cursor c = (Cursor)adapter.getItem(position);
String _id = c.getString(Contants.ID_COLUM_INDEX);
String name =c.getString(Contants.DISPLAY_NAME_COLUM_INDEX);
int max =c.getInt(Contants.DURATION_COLUM_INDEX);
intent.putExtra("_id", _id);
intent.putExtra("name", name);
intent.putExtra("max", max);
startActivity(intent);
}
}
//AsyncQueryHandlerHandler+ Thread
private void startQuery(){
MyQueryHandlermQueryHandler = new MyQueryHandler(getContentResolver());
Uriuri = Media.EXTERNAL_CONTENT_URI;
mQueryHandler.startQuery(
0,//查询唯一识别
null,
uri,
Contants.PROJECTION,
null,
null,
null);
}
//异步查询
private class MyQueryHandler extendsAsyncQueryHandler{
publicMyQueryHandler(ContentResolver cr) {
super(cr);
// TODO Auto-generated constructor stub
}
//查询完成调用
@Override
protected voidonQueryComplete(int token, Object cookie, Cursor cursor) {
// TODO Auto-generated method stub
super.onQueryComplete(token, cookie,cursor);
//把数据设置给adapter
adapter.changeCursor(cursor);
}
}
private class MyAdapter extends CursorAdapter{
public MyAdapter(Context context, Cursorc) {
super(context,c);
//TODO Auto-generated constructor stub
}
@Override
public View newView(Context context,Cursor cursor, ViewGroup parent) {
//TODO Auto-generated method stub
Viewview = getLayoutInflater().inflate(R.layout.item, null);
ViewHolderholder = new ViewHolder();
holder.tv_name= (TextView) view.findViewById(R.id.tv_name);
holder.tv_arthies= (TextView) view.findViewById(R.id.tv_arthies);
view.setTag(holder);
returnview;
}
@Override
public void bindView(View view, Contextcontext, Cursor cursor) {
//TODO Auto-generated method stub
//1得到数据
Stringname = cursor.getString(Contants.DISPLAY_NAME_COLUM_INDEX);
Stringartist = cursor.getString(Contants.ARTIST_COLUM_INDEX);
//2得到控件
ViewHolderholder = (ViewHolder) view.getTag();
//绑定数据
holder.tv_name.setText(name);
holder.tv_arthies.setTag(artist);
}
}
private class ViewHolder{
TextView tv_name;
TextView tv_arthies;
}
歌曲实体
public class Contents {
public static final String[] PROJECTION = new String[]{
Media._ID,
Media.DISPLAY_NAME,
Media.ARTIST,
Media.DURATION
};
public static final int ID_COLUM_INDEX = 0;
public static final int DISPLAY_NAME_COLUM_INDEX = 1;
public static final int ARTIST_COLUM_INDEX = 2;
public static final int DURATION_COLUM_INDEX = 3;
}
播放歌曲界面
public class MediePlayingActivity extends Activity implements OnSeekBarChangeListener {
private MediaPlayer mp;
private String _id;
// 判断之前是否暂停过
private boolean flag = false;
private SeekBar seekBar;
private Handler mHandler = new Handler();
private int max;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 得到控件
EditText et_name = (EditText) findViewById(R.id.et_name);
seekBar = (SeekBar)findViewById(R.id.sb);
// 得到数据
Intent intent = getIntent();
_id = intent.getStringExtra("_id");
String name = intent.getStringExtra("name");
max = intent.getIntExtra("max", 0);
et_name.setText(name);
mp = new MediaPlayer();
// 设置进度条最大值
seekBar.setMax(max);
seekBar.setOnSeekBarChangeListener(this);
}
private class MyTask implements Runnable{
@Override
public void run() {
// TODO Auto-generated methodstub
// 不断的把歌曲进度赋值给进度条
int position = mp.getCurrentPosition();
seekBar.setProgress(position);
mHandler.postDelayed(this,200);
}
}
// 开始按钮
public void start(View v){
// 开启一个线程去更新进度x
mHandler.post(new MyTask());
mp.reset();
Uri uri = Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI, _id);
try {
mp.setDataSource(this,uri);
mp.prepare();
mp.start();
} catch (Exception e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
// 暂停按钮
public void pause(View v){
Buttonb = (Button)v;
if(mp.isPlaying()){
mp.pause();
flag = true;
b.setText("继续");
}else{
if(flag){
mp.start();
b.setText("暂停");
}
}
}
// 重新播放按钮
public void mcontinue(View v){
mp.reset();
Uri uri = Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI, _id);
try {
mp.setDataSource(this,uri);
mp.prepare();
mp.start();
} catch (Exception e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
// 暂停按钮
public void stop(View v){
mp.stop();
}
// 拖动事件
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
}
// 开始拖动
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
// 拖动结束
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
int i = seekBar.getProgress();
mp.seekTo(i);
mp.start();
}
}
视频播放器
使用了SurfaceView控件显示视频
SurfaceView
可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器
SurfaceHolder
用来操纵surface,处理它在Canvas上画的效果和动画,控制表面,大小,像素等
surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
//设置SurfaceHolder,操作surfaceView
SurfaceHolder holder = surfaceView.getHolder();
//不让SurfaceView去缓存数据,直接把数据输出
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置固定的大小
holder.setFixedSize(176, 144);
//设置屏幕的高亮
holder.setKeepScreenOn(true);
//设置屏幕的高亮
surfaceView.setKeepScreenOn(true);
要在点击开始的时候设置显示
mp.setDisplay(sv.getHolder());