




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 使用MediaPlayer播放音频MediaPlayer类有以下三个成员函数:start() 开始播放stop() 停止播放pause() 暂停播放用以控制播放过程装载播放文件则用:static MediaPlayer create(Context context,Uri uri)Static MediaPlayer create(Context context,int resid) 1. 使用MediaPlayer播放音频用同一个MediaPlayer对象播放不同文件,使用其void setDataSource(String path)void setDataSource(FileDe
2、scriptor fd,long offset,long length)void setDataSource(FileDescriptor fd)void setDataSource(Context contex,Uri uri)然后再调用 prepare1. 使用MediaPlayer播放音频try mPlayer.reset();mPlayer.setDataSource(“/mnt/sdcard/next.mp3”);mPlayer.prepare();mPlayer.start();catch( IOException e) e.printStackTrace();1. 使用Media
3、Player播放音频MediaPlayer 还有一些事件可以监听setOnCompletionListener 监听播放完成setOnErrorListener 监听播放错误setOnPreparedListener 监听 prepare被调用这件事setOnSeekCompleteListener 监听seek()被调用seek用来定位播放位置1. 使用MediaPlayer播放音频MediaPlayer 常用方法:getCurrentPosition : 得到当前播放位置getDuration: 获得文件时间长度getVideoHeight: 获得视频高度getVideoWidthisPl
4、aying :是否正在播放seekTo: 定位到某处setVolume: 设置音量1. 使用MediaPlayer播放音频如果要随时检测当前播放位置,可以用一个Timer 和一个Handler, 每隔一段时间就调用MediaPlayer的getCurrentPosition编写MP3+LRC 同步播放程序时可这么做00:10.26book n.书,书本00:14.79book n.书,书本00:16.37n.书,书本00:20.35* ruler 尺子00:25.77ruler 尺子00:27.56尺子1. 使用MediaPlayer播放音频1) 播放资源文件:MediaPlayer mPla
5、yer = MediaPlayer.create(this,R.raw.song);mPlayer.start();2) 播放asset文件夹下文件:AssetManager am = getAssets();AssetFileDescriptor afd = am.openFd(music);MediaPlayer.mPlayer = new MediaPlayer();mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength();mPlayer.prepare();mPlayer.sta
6、rt();1. 使用MediaPlayer播放音频3) 播放外存上的声音:MediaPlayer mPlayer = new MediaPlayer();mPlayer.setDataSource(“/mnt/sdcard/mysong.mp3”);mPlayer.prepare();mPlayer.start();4) 播放网络音频:Uir uri = Uri.parse(/abc.mp3);MediaPlayer.mPlayer = new MediaPlayer();mPlayer.setDataSource(this,uri);mPlayer.prepare();mPlayer.sta
7、rt();2. 基于Service的音乐播放器(P419,MusicBox)播放 assets文件夹下三个文件:wish.mp3,promise.mp3,beautiful.mp32. 基于Service的音乐播放器(P419,MusicBox)MusicBox.javapublic class MusicBox extends Activityimplements OnClickListener/ 获取界面中显示歌曲标题、作者文本框TextView title , author;/播放/暂停、停止按钮ImageButton play , stop;ActivityReceiver activ
8、ityReceiver;public static final String CTL_ACTION = org.crazyit.action.CTL_ACTION;public static final String UPDATE_ACTION = org.crazyit.action.UPDATE_ACTION;/ 定义音乐的播放状态,0 x11代表没有播放;0 x12代表正在播放;0 x13代表暂停int status = 0 x11;public class MusicBox extends Activityimplements OnClickListener/ 获取界面中显示歌曲标题、
9、作者文本框TextView title , author;/播放/暂停、停止按钮ImageButton play , stop;ActivityReceiver activityReceiver;public static final String CTL_ACTION = org.crazyit.action.CTL_ACTION;public static final String UPDATE_ACTION = org.crazyit.action.UPDATE_ACTION;/ 定义音乐的播放状态,0 x11代表没有播放;0 x12代表正在播放;0 x13代表暂停int status
10、= 0 x11;String titleStrs = new String心愿,约定,美丽新世界;String authorStrs = new String未知艺术家,周蕙,伍佰; Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);/ 获取程序界面界面中的两个按钮play = (ImageButton) this.findViewById(R.id.play);stop = (ImageButton) t
11、his.findViewById(R.id.stop);title = (TextView) findViewById(R.id.title);author = (TextView) findViewById(R.id.author);/ 为两个按钮的单击事件添加监听器play.setOnClickListener(this);stop.setOnClickListener(this);activityReceiver = new ActivityReceiver();/ 创建IntentFilterIntentFilter filter = new IntentFilter();/ 指定Br
12、oadcastReceiver监听的Actionfilter.addAction(UPDATE_ACTION);/ 注册BroadcastReceiverregisterReceiver(activityReceiver, filter);Intent intent = new Intent(this, MusicService.class);/ 启动后台ServicestartService(intent);/ 自定义的BroadcastReceiver,负责监听从Service传回来的广播public class ActivityReceiver extends BroadcastRece
13、iverOverridepublic void onReceive(Context context, Intent intent)/ 获取Intent中的update消息,update代表播放状态int update = intent.getIntExtra(update, -1);/ 获取Intent中的current消息,current代表当前正在播放的歌曲int current = intent.getIntExtra(current, -1);if(current = 0)title.setText(titleStrscurrent);author.setText(authorStrs
14、current);switch (update)case 0 x11:play.setImageResource(R.drawable.play);status = 0 x11;break;/ 控制系统进入播放状态case 0 x12:/ 播放状态下设置使用暂停图标play.setImageResource(R.drawable.pause);/ 设置当前状态status = 0 x12;break;/ 控制系统进入暂停状态case 0 x13:/ 暂停状态下设置使用播放图标play.setImageResource(R.drawable.play); / 设置当前状态status = 0 x
15、13;break;Overridepublic void onClick(View source)/ 创建IntentIntent intent = new Intent(org.crazyit.action.CTL_ACTION);switch (source.getId()/ 按下播放/暂停按钮case R.id.play:intent.putExtra(control, 1);break;/ 按下停止按钮case R.id.stop:intent.putExtra(control, 2);break;/ 发送广播 ,将被Service组件中的BroadcastReceiver接收到sen
16、dBroadcast(intent);MusicService.javapublic class MusicService extends ServiceMyReceiver serviceReceiver;AssetManager am;String musics = new Stringwish.mp3,promise.mp3,beautiful.mp3;MediaPlayer mPlayer;/当前的状态,0 x11 代表没有播放 ;0 x12代表 正在播放;0 x13代表暂停int status = 0 x11;/ 记录当前正在播放的音乐int current = 0;Override
17、public IBinder onBind(Intent intent)return null;Overridepublic void onCreate()am = getAssets();/ 创建BroadcastReceiverserviceReceiver = new MyReceiver();/ 创建IntentFilterIntentFilter filter = new IntentFilter();filter.addAction(MusicBox.CTL_ACTION);registerReceiver(serviceReceiver, filter);/ 创建MediaPla
18、yermPlayer = new MediaPlayer();/ 为MediaPlayer播放完成事件绑定监听器mPlayer.setOnCompletionListener(new OnCompletionListener()Overridepublic void onCompletion(MediaPlayer mp)current+;if (current = 3)current = 0;/* 发送广播通知Activity更改文本框 */Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(c
19、urrent, current);/ 发送广播 ,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);/ 准备、并播放音乐prepareAndPlay(musicscurrent););super.onCreate();public class MyReceiver extends BroadcastReceiverOverridepublic void onReceive(final Context context, Intent intent)int control = intent.getIntExtra(control
20、, -1);switch (control)/ 播放或暂停case 1:/ 原来处于没有播放状态if (status = 0 x11)/ 准备、并播放音乐prepareAndPlay(musicscurrent);status = 0 x12;/ 原来处于播放状态else if (status = 0 x12)/ 暂停mPlayer.pause();/ 改变为暂停状态status = 0 x13;/ 原来处于暂停状态else if (status = 0 x13)/ 播放mPlayer.start();/ 改变状态status = 0 x12;break;/ 停止声音case 2:/ 如果原来
21、正在播放或暂停if (status = 0 x12 | status = 0 x13)/ 停止播放mPlayer.stop();status = 0 x11;/* 发送广播通知Activity更改图标、文本框 */Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(update, status);sendIntent.putExtra(current, current);/ 发送广播 ,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendInte
22、nt);private void prepareAndPlay(String music) try / 打开指定音乐文件AssetFileDescriptor afd = am.openFd(music);mPlayer.reset();/使用MediaPlayer加载指定的声音文件。mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength();/ 准备声音mPlayer.prepare();/ 播放mPlayer.start();catch (IOException e)e.print
23、StackTrace();3. 使用SoundPool播放音效(P432,SoundPool)MediaPlayer占用资源多。SoundPool适用于播放多个短促的音效。1) 创建SoundPool对象:SoundPool(int maxStreams,int streamType,in srcQuality)2) 用load 方法加载声音int load (Context context,int resid,int priority)int load (FileDescriptor fd,long offset Context context,int resid,int priority)
24、int load(AssetFileDescriptor afd, int priority)int load(String path,int priority)priority 参数为1. load加载声音后会返回声音的id,以后可以通过id来指定要播放的声音。3. 使用SoundPool播放音效(P432,SoundPool)3)play播放声音int play(int soundID,float leftVolume,float rightVolume,int priority,int loop,float rate)rate指定播放速度public class SoundPoolTes
25、t extends Activityimplements OnClickListenerButton bomb , shot , arrow;/ 定义一个SoundPoolSoundPool soundPool;HashMap soundMap = new HashMap();Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);bomb = (Button) findViewById(R.id.bomb);s
26、hot = (Button) findViewById(R.id.shot);arrow = (Button) findViewById(R.id.arrow);/ 设置最多可容纳10个音频流,音频的品质为5 soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);/ load方法加载指定音频文件,并返回所加载的音频ID。此处使用HashMap来管理这些音频流soundMap.put(1 , soundPool.load(this, R.raw.bomb , 1);soundMap.put(2 , soundPool.load(
27、this, R.raw.shot , 1);soundMap.put(3 , soundPool.load(this, R.raw.arrow , 1);bomb.setOnClickListener(this);shot.setOnClickListener(this);arrow.setOnClickListener(this);/ 重写OnClickListener监听器接口的方法Overridepublic void onClick(View source)/ 判断哪个按钮被单击switch(source.getId()case R.id.bomb:soundPool.play(sou
28、ndMap.get(1), 1, 1, 0, 0, 1);break;case R.id.shot:soundPool.play(soundMap.get(2), 1, 1, 0, 0, 1);break;case R.id.arrow:soundPool.play(soundMap.get(3), 1, 1, 0, 0, 1);break;4. 使用VideoView播放视频(P435,VedioViewTest)1) 界面布局中加入 VideoView组件2) 用VideoView的setVideoPath(String path)setVidwoURI(Uri uri)加载视频3)用 s
29、tart(),stop(),pause()控制视频播放videoView同样有 getDuration,getCurrentPosition,seekTo,以及setOnCompletionListener等方法public class VedioViewTest extends ActivityVideoView videoView;MediaController mController;Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);getWindow().s
30、etFormat(PixelFormat.TRANSLUCENT);setContentView(R.layout.main);/ 获取界面上VideoView组件videoView = (VideoView) findViewById(R.id.video);/ 创建MediaController对象mController = new MediaController(this);File video = new File(/mnt/sdcard/movie.mp4);if(video.exists()videoView.setVideoPath(video.getAbsolutePath()
31、;/ 设置videoView与mController建立关联videoView.setMediaController(mController);/ 设置mController与videoView建立关联mController.setMediaPlayer(videoView);/ 让VideoView获取焦点videoView.requestFocus();5. 使用MediaRecorder录制音频(P439,RecordSound)1) 创建MediaRecorder对象2) 调用MediaRecorder 对象的setAudioSource方法设置声音来源,MediaRecorder.A
32、udioSource.MIC 麦克风MediaRecorder.AudioSource.VOICE_CALL电话3) 调用 MediaRecorder 对象的setOutputFormat设置录音的音频文件格式4) 调用 setAudioEncoder() ,setAudioEncodingBitRate(int bitRate),setAudioSamplingRate(int samplingRate)设置编码格式,编码位率,采样率等5) 用setOutputFile(String path)设置录音文件的保存位置6) stop停止录制,release释放资源public class Re
33、cordSound extends Activityimplements OnClickListener / 程序中的两个按钮ImageButton record , stop;/ 系统的音频文件File soundFile ;MediaRecorder mRecorder; Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);/ 获取程序界面中的两个按钮record = (ImageButton) find
34、ViewById(R.id.record);stop = (ImageButton) findViewById(R.id.stop);/ 为两个按钮的单击事件绑定监听器record.setOnClickListener(this);stop.setOnClickListener(this);Overridepublic void onDestroy()if (soundFile != null & soundFile.exists()/ 停止录音mRecorder.stop();/ 释放资源mRecorder.release();mRecorder = null;super.onDestroy
35、();Overridepublic void onClick(View source)switch (source.getId()/ 单击录音按钮case R.id.record:if (!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)Toast.makeText(RecordSound.this, SD卡不存在,请插入SD卡!, 5000).show();return;try/ 创建保存录音的音频文件soundFile = new File(Environment.getEx
36、ternalStorageDirectory().getCanonicalFile() + /sound.amr);mRecorder = new MediaRecorder();/ 设置录音的声音来源mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);/ 设置录制的声音的输出格式(必须在设置声音编码格式之前设置)mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);/ 设置声音编码的格式mRecorder.setAudioEncoder(MediaRecord
37、er.AudioEncoder.AMR_NB);mRecorder.setOutputFile(soundFile.getAbsolutePath();mRecorder.prepare();/ 开始录音mRecorder.start();catch (Exception e) e.printStackTrace();break;/ 单击停止按钮case R.id.stop:if (soundFile != null & soundFile.exists()/ 停止录音mRecorder.stop();/ 释放资源mRecorder.release();mRecorder = null;bre
38、ak;录音要有权限:6. 通过Camera进行拍照(P442,CaptureImage)用Camera的Open方法打开相机getParameters获取拍照参数,其返回Camera.Parameters对象用Camera.Parameters的方法设置拍照参数用setParameters方法,传入Camera.Parameters对象设置拍照参数startPreview()方法预览取景,此前要也难怪setPreviewDisplay(SurfaceHolder )方法设置显示取景图片的SurfaceView用 takePicture拍照用stopPreview结束取景预览,release释放
39、资源public class CaptureImage extends ActivitySurfaceView sView;SurfaceHolder surfaceHolder;int screenWidth, screenHeight;/ 定义系统所用的照相机Camera camera;/是否在浏览中boolean isPreview = false; Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);/ 设置全屏requestWindowFeature(Win
40、dow.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.main);WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();/ 获取屏幕的宽和高screenWidth =
41、 display.getWidth();screenHeight = display.getHeight();/ 获取界面中SurfaceView组件sView = (SurfaceView) findViewById(R.id.sView);/ 获得SurfaceView的SurfaceHoldersurfaceHolder = sView.getHolder();/ 为surfaceHolder添加一个回调监听器/ 为surfaceHolder添加一个回调监听器surfaceHolder.addCallback(new Callback() Overridepublic void surf
42、aceChanged(SurfaceHolder holder, int format, int width,int height) Overridepublic void surfaceCreated(SurfaceHolder holder)/ 打开摄像头initCamera();Overridepublic void surfaceDestroyed(SurfaceHolder holder)/ 如果camera不为null ,释放摄像头if (camera != null)if (isPreview)camera.stopPreview();camera.release();camer
43、a = null;);/ 设置该SurfaceView自己不维护缓冲 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);private void initCamera()if (!isPreview)camera = Camera.open();if (camera != null & !isPreview)tryCamera.Parameters parameters = camera.getParameters();/ 设置预览照片的大小parameters.setPreviewSize(screenWidth,
44、screenHeight);/ 每秒显示4帧parameters.setPreviewFrameRate(4);/ 设置图片格式parameters.setPictureFormat(PixelFormat.JPEG);/ 设置JPG照片的质量parameters.set(jpeg-quality, 85);/设置照片的大小parameters.setPictureSize(screenWidth, screenHeight);camera.setParameters(parameters);/通过SurfaceView显示取景画面camera.setPreviewDisplay(surfac
45、eHolder);/ 开始预览camera.startPreview();/ 自动对焦camera.autoFocus(null);catch (Exception e)e.printStackTrace();isPreview = true;Overridepublic boolean onKeyDown(int keyCode, KeyEvent event)switch (keyCode)/ 当用户单击照相键、中央键时执行拍照case KeyEvent.KEYCODE_DPAD_CENTER:case KeyEvent.KEYCODE_CAMERA:if (camera != null
46、& event.getRepeatCount() = 0)/ 拍照camera.takePicture(null, null , myjpegCallback);return true;break;return super.onKeyDown(keyCode, event);PictureCallback myjpegCallback = new PictureCallback()Overridepublic void onPictureTaken(byte data, Camera camera)/ 根据拍照所得的数据创建位图final Bitmap bm = BitmapFactory.d
47、ecodeByteArray(data, 0, data.length);/ 加载/layout/save.xml文件对应的布局资源View saveDialog = getLayoutInflater().inflate(R.layout.save, null);final EditText photoName = (EditText) saveDialog.findViewById(R.id.phone_name);/ 获取saveDialog对话框上的ImageView组件ImageView show = (ImageView) saveDialog.findViewById(R.id.
48、show);/ 显示刚刚拍得的照片show.setImageBitmap(bm);/使用对话框显示saveDialog组件new AlertDialog.Builder(CaptureImage.this).setView(saveDialog).setPositiveButton(保存, new OnClickListener()Overridepublic void onClick(DialogInterface dialog,int which)/ 创建一个位于SD卡上的文件File file = new File(Environment.getExternalStorageDirect
49、ory()photoName.getText().toString() + .jpg);FileOutputStream outStream = null;try/ 打开指定文件对应的输出流outStream = new FileOutputStream(file);/ 把位图输出到指定文件中press(CompressFormat.JPEG, 100, outStream);outStream.close();catch (IOException e)e.printStackTrace();).setNegativeButton(取消, null).show();/重新浏览camera.st
50、opPreview();camera.startPreview();isPreview = true; 6. 通过MediaRecorder录制视频 (P446,RecordVideo)public class RecordVideo extends Activityimplements OnClickListener / 程序中的两个按钮ImageButton record , stop;/ 系统的视频文件File videoFile ;MediaRecorder mRecorder;/ 显示视频预览的SurfaceView SurfaceView sView; / 记录是否正在进行录制 p
51、rivate boolean isRecording = false; Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);/ 获取程序界面中的两个按钮record = (ImageButton) findViewById(R.id.record);stop = (ImageButton) findViewById(R.id.stop);/ 让stop按钮不可用。stop.setEnabled(false);/ 为两个按钮的单击事件绑定监听器record.setOnClickListener(this);stop.setOnClickListener(this);/ 获取程序界面中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制作户外广告牌合同协议书
- 坡屋面小青瓦施工合同
- 医院聘用医生合同
- 回迁房房买卖合同书
- 药物治疗基础练习测试卷
- 终止服务合同协议书
- 义务植树苗木采购合同
- 皮包代加工合同范本
- 空调销售合同(2025年版)
- 机械转让协议合同范本
- 三重一大培训课件
- PCB设计可靠性评估
- 物质安全资料表(MSDS)
- 河道护坡工程安全管理体系与措施
- SNT 2360.9-2009进出口食品添加剂检验规程第9部分:着色剂
- 资产分配方案
- 【中考物理】2023届北京市第二轮复习-科普阅读题(提升题)含解析
- dr钻戒的营销策划书
- 审计基础与实务职业能力训练蔡晓方习题答案
- 新人教版五年级小学数学全册奥数(含答案)
- 口腔正畸保持器的制作
评论
0/150
提交评论