首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >多媒体开发

多媒体开发

作者头像
张哥编程
发布2024-12-17 11:07:48
发布2024-12-17 11:07:48
1K0
举报
文章被收录于专栏:云计算linux云计算linux

学习内容

Ø 使用MediaPlayer播放音乐

Ø 使用SoundPool播放音效

Ø 使用VideoView播放视频

Ø 使用MediaRecorder录制音频

Ø 使用Camera拍照

能力目标

Ø 掌握如何使用MediaPlayer播放音乐

Ø 掌握如何使用SoundPool播放音效

Ø 掌握如何使用VideoView播放视频

Ø 掌握如何使用MediaRecorder录制音频

Ø 了解如何使用Camera拍照

本章简介

纵观移动市场上的手机,特别是智能手机,大家一定会发现现在的手机已经不仅仅限接听电话、收发短信、浏览网页之类的简单功能了。手机已经发展成一个集照相机、音乐播放器、视频播放器、网页浏览器等功能于一体的智能设备。因此为手机提供音、视频的录制、播放以及照相等功能已经成为软件开发中必不可少的内容。Android原生提供了对MP3、WAV 、MP4和3GP等音频、视频格式支持的组件API,通过这些API和组件我们可以非常容易地实现强大的音频和视频功能。在本章节中我们就结合具体的案例针对Android中的多媒体开发相关的内容进行深入讲解,这部分内容包括音乐的播放、音效的播放、视频的播放、音频的录制以及拍照等功能的实现。

核心技能部分

4.1 音频播放

4.1.1 Mediaplayer播放音乐

我们经常使用手机边听音乐边浏览网页。可是音乐播放这种功能在Android系统中是如何实现的呢?本小节中我们就学习如何使用android.media.MediaPlayer类播放保存在apk中或SD卡中的音频文件。

播放apk中音频文件的步骤包括:

(1) 调用MediaPlayer的create()方法加载指定的MP3文件

(2) 调用MediaPlayer的start()、parse()、stop()等方法完成对播放状态的控制

播放SD卡上音频文件的步骤:

(1) 创建MediaPlayer对象,并调用MediaPlayer对象的setDataSource()方法加载指定的MP3文件

(2) 调用MediaPlayer对象的prepare()方法准备音频

(3) 调用MediaPlayer的start()、parse()、stop()等方法完成对播放状态的控制

示例4.1​:

使用MediaPlayer播放MP3文件。

本程序最终实现的功能既能播放apk中的音乐文件,又能播放SD卡中指定名称的文件,而且还要能控制音乐的播放、停止以及暂停。

首先在布局文件中提供提供四个id分别为btnStart1、btnStart2、btnStop和btnPause按钮,来实现播放apk中的MP3文件、播放SD卡中的MP3文件、停止播放、暂停播放功能。其中btnPause按钮上面的显示文字会随着点击而显示不同的文字。显示效果如图4.1.1和图4.1.2所示:

多媒体开发_Camera
多媒体开发_Camera

图4.1.1MediaPlayer默认界面

多媒体开发_Camera_02
多媒体开发_Camera_02

图4.1.2 MediaPlayer播放状态界面

其次是编写Activity类,在这个类中,分别为四个按钮注册单击事件、提供事件的处理方法。其中在btnStart1的事件处理方法中,我们使用到了onCompletion事件,这个事件会在音乐播放完时被触发,此处我们在音乐播放完后释放了音频资源,以便其它应用程序可以使用这个资源。详细代码如下:

public class​ MediaPlayerActivity ​extends​ Activity {

private​ MediaPlayer mediaPlayer = ​null​;

private​ Button btnPause = ​null​;

private​ Button btnStart1 = ​null​;

private​ Button btnStart2 = ​null​;

private​ Button btnStop = ​null​;

@Override

public void​ onCreate(Bundle savedInstanceState) {

super​.onCreate(savedInstanceState);

setContentView(R.layout.​mediaplayermp3​);

btnStart1 = (Button) findViewById(R.id.​btnStart1​);

btnStart2 = (Button) findViewById(R.id.​btnStart2​);

btnStop = (Button) findViewById(R.id.​btnStop​);

btnPause = (Button) findViewById(R.id.​btnPause​);

btnStart1.setOnClickListener(listener);

btnStart2.setOnClickListener(listener);

btnStop.setOnClickListener(listener);

btnPause.setOnClickListener(listener);

}

private​ OnClickListener listener = ​new​ OnClickListener() {

@Override

public void​ onClick(View view) {

switch​ (view.getId()) {

case​ R.id.​btnStart1​: // 播放​apk​中的MP3

// 在创建MediaPlayer对象的同时指定使用res/raw目录中的MP3资源

mediaPlayer = MediaPlayer.​create​(MediaPlayerActivity.​this​, R.raw.​zhubajiebeixifu​);

mediaPlayer.setOnCompletionListener(​new​ OnCompletionListener() {

@Override

public void​ onCompletion(MediaPlayer mp) {

mp.release();

setTitle("资源已经释放");

}

});

if​ (mediaPlayer != ​null​)

mediaPlayer.stop();

// 在播放之前,必须执行下列语句做准备工作

try​ {

mediaPlayer.prepare();

} ​catch​ (Exception e) {

e.printStackTrace();

}

mediaPlayer.start();// 开始播放

break​;

case​ R.id.​btnStart2​: // 播放SD卡中的MP3

mediaPlayer = ​new​ MediaPlayer();

try​ {

// 指定mp3文件的路径

mediaPlayer.setDataSource("/sdcard/aidegongfeng.mp3");

mediaPlayer.prepare();

} ​catch​ (Exception e) {

e.printStackTrace();

}

mediaPlayer.start();

break​;

case​ R.id.​btnStop​: // 停止播放

if​ (mediaPlayer != ​null​) {

mediaPlayer.stop();

}

break​;

case​ R.id.​btnPause​:// 暂停播放

if​ (mediaPlayer != ​null​) {

if​ ("播放".equals(btnPause.getText().toString())) {

mediaPlayer.start();

btnPause.setText("暂停");

} ​else if​ ("暂停".equals(btnPause.getText().toString())) {

mediaPlayer.pause();

btnPause.setText("播放");

}

}

}

}

};

}

为了使程序能够正确运行,我们首先需要在模拟器的SD卡中加入一个名为aidegongfeng的MP3文件。然后运行程序,当我们单击播放音乐的按钮时,音乐就会播放起来,当我们单击停止和暂停按钮时也会实现相应的功能。

此外,MediaPlayer也支持播放网络URL指定的音频文件,基本的代码如下:

String url = "http://........"; // 这里设置音频URL

MediaPlayer mediaPlayer = new MediaPlayer();

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.setDataSource(url);

mediaPlayer.prepare(); // 可能需要很长时间(例如要缓冲)

mediaPlayer.start();

需要注意的是,播放在线网络音频文件时,这个在线的媒体文件必须支持渐进下载。所谓渐近下载(Progressive download)是一个术语,它用来描述从服务器向客户端传输媒体文件,通常使用Http协议。用户可以在媒体文件下载完成之前播放。它和流媒体不同之处在于正在使用的终端用户设备如何接收来存储数字媒体数据。

媒体播放器可以渐近下载播放依赖于位于文件头完整的无信息(meta data)和已经从服务器下载存在于本地缓冲区的数字媒体文件。当一定量的数据对于播放设备来说是可用的了,媒体文件就开始播放。

4.1.2 SoudPool播放音效

因为MediaPlayer具有资源占用较高、延迟时间较长、不支持多个音频同时播放的特点,对于在游戏开发中出现的需要经常播放密集、短促的音效,使用MediaPlayer就不合适了。我们可以使用SoundPool技术来实现这种短促且对反应速度比较高的情况,比如游戏音效或按键声等。SoundPool除了资源占用低和反应快之外,它还支持自行设置声音的品质、音量、播放比率等。

使用SoundPool播放声音的步骤如下:

Ø 调用SoundPool的构造器创建SoundPool对象。

Ø 调用SoundPool对象的load()方法从指定的资源、文件中加载声音,此时可以使用HashMap<Integer,Integer>对象来管理声音。

Ø 调用SoundPool的play()方法播放声音。

示例4.2:

编写一个程序,实现游戏中的爆炸、射击、射箭三种动作的声音播放的效果。

首先在布局文件中提供三个id分别为bomb、shot、arrow的按钮,当用户单击这三个按钮时分别播放爆炸、射击、射箭的声音。程序界面如下图4.1.3所示:

图4.1.3 SoundPool程序界面效果

编写Activity类,详细代码如下:

public class​ SoundPoolActivity ​extends​ Activity ​implements​ OnClickListener {

private​ Button bomb = ​null​;

private​ Button shot = ​null​;

private​ Button arrow = ​null​;

private​ SoundPool soundPool = ​null​;// 定义一个SoundPool

private​ HashMap<Integer, Integer> soundMap = ​null​;

@Override

public void​ onCreate(Bundle savedInstanceState) {

super​.onCreate(savedInstanceState);

setContentView(R.layout.​soundpool​);

bomb = (Button) findViewById(R.id.​bomb​);

shot = (Button) findViewById(R.id.​shot​);

arrow = (Button) findViewById(R.id.​arrow​);

soundMap = ​new​ HashMap<Integer, Integer>();

// 设置最多可容纳13个音频流,音频的品质为6

soundPool = ​new​ SoundPool(13, AudioManager.​STREAM_SYSTEM​,6);

// load方法加载指定音频文件,并返回所加载的音频ID。此处使用HashMap

//来管理这些音频流

soundMap.put(1, soundPool.load(​this​, R.raw.​bomb​, 1));

soundMap.put(2, soundPool.load(​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监听器接口的方法

@Override

public void​ onClick(View source) {

// 判断哪个按钮被单击

switch​ (source.getId()) {

case​ R.id.​bomb​:

soundPool.play(soundMap.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​;

}

}

}

在SoundPool的构造方法中可以指定它总共支持多少个声音、声音的品质等,该方法的原型如下 :

Ø SoundPool.SoundPool(int maxStreams, int streamType, int srcQuality)

参数maxStreams指定支持多少个声音,streamType指定声音的类型,srcQuality指定声音的品质。

程序中在加载声音时用到了load方法,这个方法的原型如下:

Ø int SoundPool.load(Context context, int resId, int priority)

加载指定的音频文件,并返回所加载的文件的Id。其中参数priority目前还没有任何作用,Android建议我们将该参数设为1,以保持和未来版本的兼容性。

4.2 视频播放

4.2.1 ViedoView播放视频

现在对视频播放的支持已经成为智能手机一个必不可少的功能,对高清视频播放的支持甚至成了许多手机的卖点。所谓的视频播放指的是在Android设备上播放如3gp格式、rmvb格式、mp4格式的等各种视频文件。在Android Market上大家也能找到大量的视频播放软件,比如UC Player、暴风、QQ影音等。下面我们就使用Android提供的VideoView组件来自己做一个简单的视频播放器。

使用VideoView播放视频的步骤如下:

(1) 在布局文件中定义一个VideoView组件,当然也可以在Java代码中直接使用new生成。

(2) 使用VideoView的setVideoPath()或setVideo()方法加载对应的视频。

(3) 调用VideoView的start()、stop()、pause()等方法实现对视频播放的控制。

示例4.3

使用VideoView编写一个简单的视频播放器。

定义布局文件:

<?xml version=​"1.0"​ encoding=​"utf-8"​?>

<LinearLayout xmlns:android=​"http://schemas.android.com/apk/res/android"

android:layout_width=​"fill_parent"

android:layout_height=​"fill_parent"

android:orientation=​"vertical"​ >

<VideoView

android:id=​"@+id/videoView"

android:layout_width=​"fill_parent"

android:layout_height=​"fill_parent"​ />

</LinearLayout>

在布局文件中定义了一个VideoView组件,接下来就可以在程序中使用这个组件播放视频了。一般情况下我们常采用MediaController组件来控制视频的播放,只需要调用VideoView. setMediaController方法,即可实现使用指定的MediaControler来控制VideoView中的视频播放。下面是Activity类的详细代码:

public class​ VedioViewActivity ​extends​ Activity {

private​ VideoView videoView = ​null​;

private​ MediaController controller = ​null​;

@Override

public void​ onCreate(Bundle savedInstanceState) {

super​.onCreate(savedInstanceState);

//设置窗口格式为半透明

getWindow().setFormat(PixelFormat.​TRANSLUCENT​);

setContentView(R.layout.​videoview​);

// 获取界面上VideoView组件

videoView = (VideoView) findViewById(R.id.​videoView​);

// 创建MediaController对象

controller = ​new​ MediaController(​this​);

File video = ​new​ File("/mnt/sdcard/labixiaoxin009.mp4");

if​ (video.e xists()) {

videoView.setVideoPath(video.getAbsolutePath());

// 设置videoView与mController建立关联

videoView.setMediaController(controller);

// 设置mController与videoView建立关联

controller.setMediaPlayer(videoView);

// 让VideoView获取焦点

videoView.requestFocus();

}

}

}

在运行程序之前,我们需要先在mnt/sdcard/目录下放置一个名为labixiaoxin009.mp4视频文件,如下图4.1.4所示,最后,整个程序的运行效果如下图4.1.5所示。

多媒体开发_MediaPlayer_03
多媒体开发_MediaPlayer_03

图4.1.4 SD卡中文件图

多媒体开发_Camera_04
多媒体开发_Camera_04

图4.1.5 VideoView播放器效果图

4.3 使用MediaRecord录制音频

随着生活节奏的提高,更多的人选择用手机中的录音功能来记录身边发生的点点滴滴,而录音功能相比于传统的纸笔记事来说更加便捷,场景还原度也更高,因此对很多应用来说,为用户提供录音功能就显得极为重要了。这里所谓的录音指的是设备通过对模拟信号的采样、编码将模拟信号通过数模转换器转换为数字信号,并进行一定的压缩后进行存储的过程。在Android中要实现录音非常简单,只需要借助android.media.MediaRecorder类借助手机内置的麦克风即可实现。

使用MediaRecorder类录制声音的步骤和用到的相关方法如下:

Ø 创建MediaRecorder对象。

Ø 调用MediaRecorder对象的setAudioSource(MediaRecorder.AudioSource.MIC)方法设置声音来源为麦克风。

Ø 调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式。

Ø 调用MediaRecorder对象的setAudioencoder()、setAudioEncodingBitRate()、setAudioSamplingRate()设置所录制的声音的编码格式、编码位率、采样率等。

Ø 调用MediaRecorder对象的setOutputFile()方法设置录制的音频文件的保存位置。

Ø 调用MediaRecorder对象的prepare()方法准备录制。

Ø 调用MediaRecorde对象r的start()方法开始录制。

Ø 录制完成后,调用MediaRecorder对象的stop()方法停止录制,并调用release()方法释放资源。

示例4.4

实现一个简单的录音机,要求能够实现对开始录音、停止录音、播放录音的控制,程序界面如下图4.1.6所示。

多媒体开发_MediaRecorder_05
多媒体开发_MediaRecorder_05

图4.1.6 自制录音机效果图

首先编写布局文件,在布局文件中提供三个id分别为btnRecord、btnStop、btnPlay的按钮,分别用来实现开始录音、停止录音、播放录音的功能。

接下来实现功能的Activity类,代码如下:

public class​ MediaRecorderActivity ​extends​ Activity {

private​ File file;

private​ MediaRecorder mediaRecorder;

private​ MediaPlayer mediaPlayer;

@Override

public void​ onCreate(Bundle savedInstanceState) {

super​.onCreate(savedInstanceState);

setContentView(R.layout.​mediarecorder​);

Button start = (Button) findViewById(R.id.​btnRecord​);

start.setOnClickListener(listener);

Button stop = (Button) findViewById(R.id.​btnStop​);

stop.setOnClickListener(listener);

Button play = (Button) findViewById(R.id.​btnPlay​);

play.setOnClickListener(listener);

}

//

private​ OnClickListener listener = ​new​ OnClickListener() {

public void​ onClick(View view) {

switch​ (view.getId()) {

case​ R.id.​btnRecord​:

try​ {

//创建保存录音的音频文件

file = File.​createTempFile​("record", ".mp3");

mediaRecorder = ​new​ MediaRecorder();

//设置录音的声音来源

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.​MIC​);

//设置录制的声音的输出格式

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.​MPEG_4​);

//设置声音的编码格式

mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.​DEFAULT​);

mediaRecorder.setOutputFile(file.getAbsolutePath());

mediaRecorder.prepare();

mediaRecorder.start();//开始录音

} ​catch​ (IOException e) {

e.printStackTrace();

}

break​;

case​ R.id.​btnStop​:

if​ (mediaRecorder != ​null​) {

mediaRecorder.stop();//停止录音

mediaRecorder.release();//释放资源

mediaRecorder = ​null​;

}

break​;

case​ R.id.​btnPlay​:

try​ {

mediaPlayer = ​new​ MediaPlayer();

mediaPlayer.setDataSource(file.getAbsolutePath());

mediaPlayer.prepare();

mediaPlayer.start();

} ​catch​ (IOException e) {

e.printStackTrace();

}

break​;

}

}

};

}

本程序需要使用系统的麦克风进行录音,因此需要向该程序授予录音的权限,在功能清单文件中添加如下代码配置录音权限:

<uses-permission android:name=​"android.permission.RECORD_AUDIO"​ />

4.4 使用Camera实现拍照功能

随着手机配置的提高,很多手机的相机已经可以达到千万级像素以上,同时还支持光学变焦,这些手机的照相功能在某些方面甚至超过了一些普通的数码相机。而现在很多应用也需要调用系统的照相功能来完成相应的操作,例如现在比较流行的微博手机客户端,用户就可以在客户端中直接点击一个按钮进入到照相功能,照完之后可以直接将相片通过微博客户端上传,这里就是一个典型的通过软件调用照相功能的案例。下面我们就通过一个简单的例子来演示如何调用系统的照相功能。

Android系统中是通过Camera类对照相提供原始支持,使用Camera类进行拍照的步骤如下:

Ø 调用Camera的open()方法打开相机;

Ø 调用Camera的getParameters()方法获取拍照参数;

Ø 调用Camera.Parameters对象的相关方法设置相机参数;

Ø 调用Camera的setParameters(Camera.Parameters)方法对相机的拍照参数进行控制;

Ø 调用Camera的setPreviewDisplay()方法设置使用哪个SurfaceView来显示取景图片;

Ø 调用Camera的startPreview()方法开始预览取景 ;

Ø 调用Camera的takePicture()方法进行拍照;

Ø 拍照结束时,可以调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。

示例4.5

实现拍照的功能,要求当拍照成功之后直接把我们所拍的照片保存在SD卡中。

布局文件代码:

<?xml version=​"1.0"​ encoding=​"utf-8"​?>

<FrameLayout xmlns:android=​"http://schemas.android.com/apk/res/android"

android:layout_width=​"fill_parent"

android:layout_height=​"fill_parent"​ >

<SurfaceView

android:id=​"@+id/surfaceView"

android:layout_width=​"fill_parent"

android:layout_height=​"fill_parent"​ />

<RelativeLayout

android:id=​"@+id/buttonlayout"

android:layout_width=​"fill_parent"

android:layout_height=​"fill_parent"

android:visibility=​"gone"​ >

<Button

android:id=​"@+id/takepicture"

android:layout_width=​"wrap_content"

android:layout_height=​"wrap_content"

android:layout_alignParentBottom=​"true"

android:layout_alignParentRight=​"true"

android:layout_marginRight=​"30dp"

android:text=​"@string/takebutton"​ />

<Button

android:id=​"@+id/foucebutton"

android:layout_width=​"wrap_content"

android:layout_height=​"wrap_content"

android:layout_alignTop=​"@id/takepicture"

android:layout_marginRight=​"50dp"

android:layout_toLeftOf=​"@id/takepicture"

android:text=​"@string/foucebutton"​ />

</RelativeLayout>

</FrameLayout>

Activity类代码:

public class​ TakePictureActivity ​extends​ Activity {

private​ Camera camera = ​null​;

private​ RelativeLayout layout = ​null​;

@Override

public void​ onCreate(Bundle savedInstanceState) {

super​.onCreate(savedInstanceState);

setContentView(R.layout.​takepicture​);

layout = (RelativeLayout) ​this​.findViewById(R.id.​buttonlayout​);

Button takepictureBtn = (Button) ​this​.findViewById(R.id.​takepicture​);

Button foucebtn = (Button) ​this​.findViewById(R.id.​foucebutton​);

SurfaceView surfaceView = (SurfaceView) ​this​.findViewById(R.id.​surfaceView​);

surfaceView.getHolder().setType(SurfaceHolder.​SURFACE_TYPE_PUSH_BUFFERS​);

surfaceView.getHolder().setFixedSize(176, 144);

surfaceView.getHolder().addCallback(​new​ SurfaceCallback());

ButtonClickListener lisetener = ​new​ ButtonClickListener();

takepictureBtn.setOnClickListener(lisetener);

foucebtn.setOnClickListener(lisetener);

}

private final class​ ButtonClickListener ​implements​ View.OnClickListener {

public void​ onClick(View v) {

if​ (camera != ​null​) {

if​ (v.getId() == R.id.​takepicture​) {

camera.takePicture(​null​, ​null​, ​new​ MyPictureCallback());

layout.setVisibility(ViewGroup.​GONE​);

} ​else​ {

camera.autoFocus(​null​);// 对焦

}

}

}

private final class​ MyPictureCallback ​implements​ PictureCallback {

public void​ onPictureTaken(​byte​[] data, Camera camera) {

try​ {

File file = ​new​ File(Environment.​getExternalStorageDirectory​(), System.​currentTimeMillis​() + ".jpg");

FileOutputStream outStream = ​new​ FileOutputStream(file);

outStream.write(data);

outStream.close();

camera.startPreview();

} ​catch​ (Exception e) {

e.printStackTrace();

}

}

}

}

@Override

public boolean​ onTouchEvent(MotionEvent event) {

if​ (event.getAction() == MotionEvent.​ACTION_DOWN​) {

layout.setVisibility(ViewGroup.​VISIBLE​);

}

return super​.onTouchEvent(event);

}

private final class​ SurfaceCallback ​implements​ Callback {

@Override

public void​ surfaceCreated(SurfaceHolder holder) {

try​ {

camera = Camera.​open​();

Camera.Parameters parameters = camera.getParameters();

Log.​i​("MainActivity", parameters.flatten());

parameters.setPreviewSize(800, 480);

parameters.setPreviewFrameRate(5);

parameters.setPictureFormat(ImageFormat.​JPEG​);

parameters.setPictureSize(640, 480);

camera.setParameters(parameters);

camera.setPreviewDisplay(holder);

camera.startPreview();

} ​catch​ (IOException e) {

e.printStackTrace();

}

}

@Override

public void​ surfaceChanged(SurfaceHolder holder, ​int​ format, ​int​ width, ​int​ height) {

}

@Override

public void​ surfaceDestroyed(SurfaceHolder holder) {

if​ (camera != ​null​)

camera.release();

camera = ​null​;

}

}

}

功能清单文件中添加权限:

<!-- 在SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 往SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.CAMERA"/>

运行程序(建议使用真机进行测试),在SD卡中会生成一张我们新拍的照片,导出照片到电脑就查看我们刚才拍出来的照片了。

任务实训部分

1:游戏片段模拟实现

训练技能点

Ø Android中绘图的基本知识

Ø 使用SoundPool播放音效

需求说明

模拟实现极品飞车中汽车开动的动作,要求汽车在沿着某一方向开动的时候,系统能够自动模拟发动机发出嗡嗡的声音。

实现步骤

(1) 在屏幕中用Android系统默认提供的基本图形绘制相关的API绘制一个小汽车。

(2) 给小汽车添加沿某一方向开动的功能。

(3) 给小汽车添加开动时的发动机的嗡鸣效果。

2:自定义视频播放器

训练技能点

Ø 使用VideoView播放视频

需求说明

模拟UC影音自己编写一个视频播放器软件,要求:

(1) 实现本地视频播放的功能。

(2) 实现在线视频播放的功能,至于播放哪个网站的视频,可以由用户手工输入地址简单实现。

(3) 添加播放记录的功能。

整个软件界面参看下图4.2.1。

多媒体开发_多媒体_06
多媒体开发_多媒体_06

图4.2.1 UC影音

巩固练习

一、简答题

1. 简单描述采用MediaPlayer播放音频文件的步骤。

2. 简单描述使用Camera类进行拍照的步骤。

二、上机练习

参考4.4节的内容自己实现一个照相机软件,要求除了能够的把拍得的照片保存在本地,还能够上传到指定的网站,比如邮箱等。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学习内容
  • 4.1 音频播放
    • 4.1.1 Mediaplayer播放音乐
    • 4.1.2 SoudPool播放音效
    • 4.2.1 ViedoView播放视频
  • 4.3 使用MediaRecord录制音频
  • 4.4 使用Camera实现拍照功能
    • 1:游戏片段模拟实现
    • 2:自定义视频播放器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档