Android多媒体开发

wc900703 贡献于2012-06-07

作者 whq  创建于2012-02-17 14:54:00   修改者ZGC  修改于2012-06-05 08:56:00字数9018

文档摘要:实验目的掌握Android多媒体的开发。音频播放视频播放闹钟设置实验步骤1、音频播放的使用。调用并运行程序,实现如下效果。Android提供的AudioManager来管理系统音量,通过Context的getSystemService()方法来获取系统的音频管理器使用MediaPlayer播放音频,程序可以调用MediaPlayer的如下三个方法进行播放控制。
关键词:

实验13 Android多媒体开发(1) 一、 实验目的 1、 掌握Android多媒体的开发。 2、 音频播放 3、 视频播放 4、 闹钟设置 二、 实验步骤 1、音频播放的使用。调用并运行程序,实现如下效果。 n Android提供的AudioManager来管理系统音量,通过Context的getSystemService()方法来获取系统的音频管理器 n 使用MediaPlayer播放音频,程序可以调用MediaPlayer的如下三个方法进行播放控制。 Ø start():开始或恢复播放 Ø stop():停止播放 Ø pause():暂停播放 n 为了让MediaPlayer来装载指定音频文件,使用如下方法 Ø static MediaPlayer create (Context context, Uri uri):从指定Uri来装载音频文件,并返回创建的MediaPlayer对象。 Ø static MediaPlayer create (Context context, int resid):从resid资源ID对应的资源文件中装载音频文件,并返回创建的MediaPlayer对象。 图1 程序工程架构图 图2 点击按钮都可以完成相应动作 /src/com.whq/ AudioTest.java,补充所缺代码,使程序正常运行。 package com.whq; import android.app.Activity; import android.app.Service; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ToggleButton; public class AudioTest extends Activity { Button play, up , down; ToggleButton mute; AudioManager aManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取系统的音频服务 aManager = (AudioManager) this.getSystemService(Service.AUDIO_SERVICE); // 获取界面中3个按钮和一个ToggleButton控件 play = (Button) findViewById(R.id.play); up = (Button) findViewById(R.id.up); down = (Button) findViewById(R.id.down); mute = (ToggleButton) findViewById(R.id.mute); // 为play按钮的单击事件绑定监听器 play.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 初始化MediaPlayer对象,准备播放音乐 MediaPlayer mPlayer = MediaPlayer.create(AudioTest.this, R.raw.earth); // 取消循环播放 mPlayer.setLooping(false); // 开始播放 mPlayer.start() ; } }); up.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 指定调节音乐的音频,增大音量,而且显示音量图形示意 aManager.adjustStreamVolume( AudioManager.STREAM_MUSIC , AudioManager.ADJUST_RAISE , AudioManager.FLAG_SHOW_UI); } }); down.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 指定调节音乐的音频 aManager.adjustStreamVolume( AudioManager.STREAM_MUSIC , AudioManager.ADJUST_LOWER , AudioManager.FLAG_SHOW_UI); } }); mute.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton source , boolean isChecked) { // 指定调节音乐的音频,根据isChecked确定是否需要静音 aManager.setStreamMute(AudioManager.STREAM_MUSIC , isChecked); } }); } } 2、闹钟设置实例。补充并完成程序,分析其运行的原理。 在Android中通过AlarmManager来实现闹钟,可以通过Context.getSystemService()方法来获得该服务。要实现闹钟,首先通过建立一个继承自BroadcastReceiver的类,实现onReceive()方法来接收Alarm服务。然后通过建立Intent和PendingIntent连接来调用Alarm组件。 图3未设置闹钟之前 图4 开始设置闹钟 图5 闹钟时间到了 图6 取法闹钟 /src/com.whq/ AlamrReceiver.java,补充所缺代码,使程序正常运行。 package com.whq; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class AlamrReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Toast.makeText(context, "你设置的时间到了", Toast.LENGTH_LONG).show(); } } /src/com.whq/AlarmTest.java,补充所缺代码,使程序正常运行。 package com.whq; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.TimePicker; public class AlarmTest extends Activity { /** Called when the activity is first created. */ private TextView tv = null; private Button btn_set = null; private Button btn_cel = null; private Calendar c = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) this.findViewById(R.id.textView1); btn_set = (Button) this.findViewById(R.id.button1); btn_cel = (Button) this.findViewById(R.id.button2); c = Calendar.getInstance(); btn_set.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub c.setTimeInMillis(System.currentTimeMillis()); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); new TimePickerDialog(AlarmTest.this, new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { // TODO Auto-generated method stub c.setTimeInMillis(System.currentTimeMillis()); c.set(Calendar.HOUR_OF_DAY, hourOfDay); c.set(Calendar.MINUTE, minute); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); Intent intent = new Intent(AlarmTest.this, AlamrReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(AlarmTest.this, 0, intent, 0); AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);// 设置闹钟 am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), (10 * 1000), pi);// 重复设置 tv.setText("设置的闹钟时间为:" + hourOfDay + ":" + minute); } }, hour, minute, true).show(); } }); btn_cel.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(AlarmTest.this, AlamrReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(AlarmTest.this, 0, intent, 0); AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE); am.cancel(pi);// ================================== tv.setText("闹钟取消");// ================================ } }); } } 注意: 1、 布局文件main.xml文件自行编写,要求所有组件的所显示的文本内容,都取自strings.xml文件。 2、 由于使用了BroadcastReceriver服务,因此需要在AndroidManifest.xml中进行声明。 3、使用MediaPayer和SurfaceView播放视频。调试并运行程序。 n 使用MediaPayer播放视频的步骤如下: Ø 创建MediaPayer对象,并让它加载指定的视频文件 Ø 在界面布局文件中定义SurfaceView组件,或在程序中创建SurfaceView组件,并为SurfaceView的SurfaceHolder添加Callback监听器。 Ø 调用MediaPayer对象的setDisplay(SurfaceHolder sh)将所播放的视频图像输出到指定的SurfaceView组件。 Ø 调用MediaPayer对象的start()、stop()和pausr()方法控制视频的播放。 /src/com.whq/ SurfaceViewPlayVideo.java,补充所缺代码,使程序正常运行。 package com.whq; import java.io.IOException; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; public class SurfaceViewPlayVideo extends Activity implements OnClickListener { SurfaceView surfaceView; ImageButton play , pause , stop; MediaPlayer mPlayer; //记录当前视频的播放位置 int position; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取界面中的3个按钮 play = (ImageButton) findViewById(R.id.play); pause = (ImageButton) findViewById(R.id.pause); stop = (ImageButton) findViewById(R.id.stop); // 为3个按钮的单击事件绑定事件监听器 play.setOnClickListener(this); pause.setOnClickListener(this); stop.setOnClickListener(this); // 创建MediaPlayer mPlayer = new MediaPlayer(); surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView); // 设置SurfaceView自己不管理的缓冲区 surfaceView.getHolder().setType( SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 设置播放时打开屏幕 surfaceView.getHolder().setKeepScreenOn(true); surfaceView.getHolder().addCallback(new SurfaceListener()); } @Override public void onClick(View source) { try { switch (source.getId()) { // 播放按钮被单击 case R.id.play: play(); break; // 暂停按钮被单击 case R.id.pause: if (mPlayer.isPlaying()) { mPlayer.pause(); } else { mPlayer.start(); } break; // 停止按钮被单击 case R.id.stop: if (mPlayer.isPlaying()) mPlayer.stop(); break; } } catch (Exception e) { e.printStackTrace(); } } private void play() throws IOException { mPlayer.reset(); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // 设置需要播放的视频 mPlayer.setDataSource("/mnt/sdcard/nobody.3gp"); // 把视频画面输出到SurfaceView mPlayer.setDisplay(surfaceView.getHolder()); mPlayer.prepare(); mPlayer.start(); } private class SurfaceListener implements SurfaceHolder.Callback { @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { if (position > 0) { try { // 开始播放 play(); // 并直接从指定位置开始播放 mPlayer.seekTo(position); position = 0; } catch (Exception e) { e.printStackTrace(); } } } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } // 当其他Activity被打开,暂停播放 @Override protected void onPause() { if (mPlayer.isPlaying()) { // 保存播放点 position = mPlayer.getCurrentPosition(); mPlayer.stop(); } super.onPause(); } @Override protected void onDestroy() { // 停止 if (mPlayer.isPlaying()) mPlayer.stop(); // 释放资源 mPlayer.release(); super.onDestroy(); } } /res/layout/main.xml

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档