维修网站怎么做,跨境电商发展现状如何,深圳推广平台,wordpress文章对游客不显示目录
9.动画与多媒体#xff08;二#xff09;
2.播放音频与视频
2-1.使用MediaPlayer类播放音频
2-2.使用SoundPool类播放音频
2-3.使用 VideoView组件播放视频
4.难点解答
4-1.MediaPlayer 与SoundPool的区别
4-2.MediaController 的作用 9.动画与多媒体#xff0…目录
9.动画与多媒体二
2.播放音频与视频
2-1.使用MediaPlayer类播放音频
2-2.使用SoundPool类播放音频
2-3.使用 VideoView组件播放视频
4.难点解答
4-1.MediaPlayer 与SoundPool的区别
4-2.MediaController 的作用 9.动画与多媒体二
2.播放音频与视频
Android提供了对常用音频和视频格式的支持它所支持的音频格式有MP3 ( .mp3)、3GPP(.3gp)、Ogg (.ogg)和WAVE (.wav)等支持的视频格式有3GPP (.3gp) 和MPEG-4 (.mp4)等。通过Android API提供的相关方法可以在Android中实现音频与视频的播放。
2-1.使用MediaPlayer类播放音频
在Android中提供了MediaPlayer 类来播放音频。使用MediaPlayer 类播放音频比较简单只需创建该类的对象并为其指定要播放的音频文件然后调用该类的start()方法播放即可。MediaPlayer中有许多方法其中比较常用的方法及其描述如表9.6 所示。
表9.6 MediaPlayer 类中的常用方法
方法描述create(Context context, int resid)根据指定的资源ID创建一个 MediaPlayer 对象create(Context context, Uri uri)根据指定的URI创建一个 MediaPlayer 对象setDataSource()指定要装载的资源prepare()准备播放(在播放前调用)start()开始播放stop()停止播放pause()暂停播放reset()恢复MediaPlayer到未初始化状态
下面对如何使用MediaPlayar类播放音频进行详细介绍。
1.创建MediaPlayer对象并装载音频文件
创建MediaPlayer对象并装载音频文件可以使用MediaPlayer类提供的静态方法create()来实现也可以通过其无参构造方法来创建并实例化该类的对象来实现。
(1)使用create()方法创建MediaPlayer对象并装载音频文件。
MediaPlayer类的静态方法create()常用的语法格式有以下两种
◆create(Context context, int resid)
用于从资源ID所对应的资源文件中装载音频并返回新创建的MediaPlayer对象。例如要创建装载音频资源(res\raw\d.wav) 的MediaPlayer对象可以使用下面的代码
MediaPlayer playerMediaPlayer.create(this,R.raw.d);
◆create(Context context, Uri uri)
用于根据指定的URI来装载音频并返回新创建的MediaPlayer对象。例如要创建装载了音频文件(URI地址为https://www.hhh.com/sound/hhh.mp3)的MediaPlayer对象可以使用下面的代码
MediaPlayer playerMediaPlayer.create(this,Uri.parse(https://www.hhh.com/sound/hhh.mp3));
注在访问网络中的资源时要在AndroidManifest.xml文件中授于该程序访问网络的权限具体的授权代码如下
uses-permission android:nameandroid.permission.INTERNET/
(2)通过无参的构造方法来创建MediaPlayer对象并装载音频文件。
使用无参的构造方法来创建MediaPlayer对象时需要单独指定要装载的资源这可以使用MediaPlayer类的setDataSource()方法实现。
在使用setDataSource()方法装载音频文件后实际上MediaPlayer并未真正装载该音频文件还需要调用MediaPlayer的prepare()方法去真正装载音频文件。使用无参的构造方法来创建MediaPlayer对象并装载指定的音频文件可以使用下面的代码
MediaPlayer player1new MediaPlayer();
try {player1.setDataSource(/sdcard/music.mp3);//指定要装载的音频文件player1.prepare();//预加载音频
}catch (I0Exception e) {e.printStackTrace();
}
注通过MediaPlayer类的静态方法create()来创建MediaPlayer对象时已经装载了要播放的音频所以这种方法适用于播放单独的音频文件时。而通过无参的构造方法来创建MediaPlayer对象并装载音频文件时可以根据需要来随时改变要加载的文件所以这种方法适用于连续播放多个文件时。 2.开始或恢复播放
在获取到MediaPlayer对象后就可以使用MediaPlayer类提供的start()方法来开始播放音频或恢复播放已经暂停的音频。例如已经创建了一 个名称为“player” 的对象并且装载了要播放的音频可以使用下面的代码播放该音频
player.start();//开始播放 3.停止播放
使用MediaPlayer类提供的stop()方法可以停止正在播放的音频。例如已经创建了一个名称为“player” 的对象并且已经开始播放装载的音频可以使用下面的代码停止播放该音频
player.stop();//停止播放 4.暂停播放
使用MediaPlayer类提供的pause()方法可以暂停正在播放的音频。例如已经创建了一个名称为“player”的对象并且已经开始播放装载的音频可以使用下面的代码暂停播放该音频
player.pause();//暂停播放 例 MainActivity.java
package com.example.musicplayer;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaParser;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;//定义MediaPlayer对象private boolean isPause false;//定义是否暂停private File file;//定义要播放的音频文件
Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBargetSupportActionBar();actionBar.hide();//设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//获取“播放/暂停”按钮final ImageButton btn_play(ImageButton) findViewById(R.id.main_ib1);//获取“停止”按钮final ImageButton btn_stop(ImageButton) findViewById(R.id.main_ib2);filenew File(/sdcard/music.mp3);//如果音频文件存在if(file.exists()){//创建MediaPlayer对象并解析要播放的音频文件mediaPlayerMediaPlayer.create(this, Uri.parse(file.getAbsolutePath()));}else{//提示音频文件不存在Toast.makeText(MainActivity.this, 要播放的音频文件不存在, Toast.LENGTH_SHORT).show();return;}
//为MediaPlayer添加完成事件监听器实现当音频播放完毕后重新开始播放音频mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {Overridepublic void onCompletion(MediaPlayer mediaPlayer) {play();//调用play()方法实现播放功能}});
btn_play.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {if(mediaPlayer.isPlaying() !isPause){//暂停播放mediaPlayer.pause();isPausetrue;//更换为播放图标((ImageButton) view).setImageDrawable(getResources().getDrawable(R.drawable.play,null));}else{//继续播放mediaPlayer.start();//更换为暂停图标((ImageButton) view).setImageDrawable(getResources().getDrawable(R.drawable.pause,null));isPausefalse;}}});
btn_stop.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {mediaPlayer.stop();//停止播放//更换为播放图标btn_play.setImageDrawable(getResources().getDrawable(R.drawable.play,null));}});}//音频播放private void play(){try{mediaPlayer.reset();//重置MediaPlayer对象mediaPlayer.setDataSource(file.getAbsolutePath());//重新设置要播放的音频mediaPlayer.prepare();//预加载音频mediaPlayer.start();//开始播放} catch (Exception e) {e.printStackTrace();//输出异常信息}}
//当前Activity销毁时protected void onDestory(){if(mediaPlayer.isPlaying()){mediaPlayer.stop();}mediaPlayer.release();//释放资源super.onDestroy();}
}
注要访问SD卡的文件需要在AndroidManifest.xml文件中赋予程序访问SD卡的权限关键代码如下
uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE/
uses-permission android:nameandroid.permission.MOUNT_UNMOUNT_FILESYSTEMS/
application节点下
android:requestLegacyExternalStoragetrue 2-2.使用SoundPool类播放音频
Android还提供了另一个播放音频的类——SoundPool (即音频池)可以同时播放多个短小的音频而且占用的资源较少。使用SoundPool类播放音频首先需要创建SoundPool对象然后加载所要播放的音频最后调用play()方法播放音频。
1.创建SoundPool对象
SoundPool类提供了一个构造方法用来创建SoundPool对象该构造方法的语法格式如下
SoundPool(int maxStreams,int streamType,int srcQuality)
参数说明如下
◆maxStreams指定可以容纳多少个音频。
◆streamType:指定声音类型可以通过AudioManager类提供的常量进行指定通常使用STREAM_MUSIC。
◆srcQuality指定音频的品质默认值为0。
例如创建个可以容纳 10个音频的SoundPool对象可以使用下面的代码
//创建一个SoundPoo1对象 该对象可以容纳10个音频流
oundPool soundpool new SoundPool(10,AudioManager.STREAM_SYSTEM, 0);
2.加载所要播放的音频
创建SoundPool 对象后可以调用load()方法来加载要播放的音频。load()方法的语法格式有以下4种
◆public int load (Context context, int resld, int priority)通过指定的资源ID来加载音频。
◆public int load (String path, int priority)通过音频文件的路径来加载音频。
◆public int load (AssetFileDescriptor afd, int priority)从AssetFileDescriptor所对应的文件中加载音频。
◆public int load (FileDescriptor fd, long offset, long length, int priority)加载FileDescriptor对象中从offset开始长度为length的音频。
例如要通过资源ID来加载音频文件ding.wav,可以使用下面的代码
soundpool.load(this,R.raw.ding,1);
注为了更好地管理所加载的每个音频一般使用HashMapInteger, Integer对象来管理这些音频。这时可以先创建一个HashMapInteger, Integer对象然后应用该对象的put()方法将加载的音频保存到该对象中。例如创建一个HashMapInteger, Integer对象并应用put() 方法添加一个音频可以使用下面的代码
//创建一个HashMap对象
HashMapInteger,Integer soundmap new HashMapInteger,Integer();
soundmap.put(1, soundpool.load(this, R.raw.chimes, 1));
3.播放音频
调用SoundPool对象的play()方法可播放指定的音频。play() 方法的语法格式如下
play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
play()方法各参数的说明如表9.7 所示。
表9.7 play() 方法的参数说明
参数描述soundID指定要播放的音频该音频为通过load() 方法返回的音频leftVolume指定左声道的音量取值范围为0.0~1.0rightVolume指定右声道的音量取值范围为0.0~1.0priority指定播放音频的优先级数值越大优先级越高loop指定循环次数0为不循环-1 为循环rate指定速率正常为1最低为0.5 最高为2
例如要播放raw资源中保存的音频文件notify.wav,可以使用下面的代码
//播放指定的音频
soundpool.play(soundpool.load(MainActivity.this,R.raw.notify, 1), 1, 1, 0, 0, 1);
例 activity_main.xml
?xml version1.0 encodingutf-8?
RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivity
ListViewandroid:idid/main_lv1android:layout_widthmatch_parentandroid:layout_heightmatch_parent/
/RelativeLayout
main.xml
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationverticalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:padding10dpandroid:layout_gravitycenterandroid:idid/titleandroid:textSize22sp/
/LinearLayout
MainActivity.java
package com.example.selectringtone;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.media.AudioAttributes;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBargetSupportActionBar();actionBar.hide();
ListView listView(ListView) findViewById(R.id.main_lv1);//获取列表视图String[] titlenew String[]{江南,关键词,爱不会绝迹,修炼爱情,那些你很冒险的梦,爱笑的眼睛,一千年以后};//定义并初始化保存列表项文字的数组//创建一个list集合ListMapString,Object listItemsnew ArrayListMapString,Object();//通过for循环将列表项文字保存到Map中并添加到List集合中for(int i0;ititle.length;i){MapString,Object mapnew HashMapString,Object();//实例化Map对象map.put(name,title[i]);listItems.add(map);//将Map对象添加到List集合中}
AudioAttributes attrnew AudioAttributes.Builder()//设置音效相关属性.setUsage(AudioAttributes.USAGE_GAME)//设置音效使用场景.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//设置音效的类型.build();final SoundPool soundPoolnew SoundPool.Builder()//创建SoundPool对象.setAudioAttributes(attr)//设置音效池的属性.setMaxStreams(10)//设置最多可容纳10个音频流.build();
final HashMapInteger,Integer soundmapnew HashMapInteger,Integer();//保存要播放的音频流到HashMap对象中soundmap.put(0,soundPool.load(this,R.raw.jiangnan,1));soundmap.put(1,soundPool.load(this,R.raw.guanjianci,1));soundmap.put(2,soundPool.load(this,R.raw.aibuhuijueji,1));soundmap.put(3,soundPool.load(this,R.raw.xiulianaiqing,1));soundmap.put(4,soundPool.load(this,R.raw.naxienihenmaoxiandemeng,1));soundmap.put(5,soundPool.load(this,R.raw.aixiaodeyanjing,1));soundmap.put(6,soundPool.load(this,R.raw.yiqiannianyihou,1));
//创建SimpleAdapter适配器SimpleAdapter adapternew SimpleAdapter(this,listItems,R.layout.main,new String[]{name,},new int[]{R.id.title});listView.setAdapter(adapter);//将适配器与ListView关联
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {Overridepublic void onItemClick(AdapterView? adapterView, View view, int i, long l) {//获取选项的值MapString,Object map(MapString, Object) adapterView.getItemAtPosition(i);//播放所选音频soundPool.play(soundmap.get(i),1,1,0,0,1);}});}
} 2-3.使用 VideoView组件播放视频
在Android中提供了VideoView组件用于播放视频文件。要想使用VideoView组件播放视频首先需要在布局文件中添加该组件 然后在Activity 中获取该组件并应用其setVideoPath()方法或setVideoURI()方法加载要播放的视频最后调用start()方法来播放视频。另外VideoView组件还提供了stop()和pause()方法分别用于停止和暂停视频的播放。
在布局文件中添加VideoView组件的基本语法格式如下
VideoView属性列表
/VideoView
VideoView组件支持的XML属性如表9.8所示。
表9.8 VideoView 组件支持的XML 属性
XML属性描述android:id设置组件的IDandroid:background设置背景可以设置背景图片也可以设置背景颜色android:layout_gravity设置对齐方式android:layout_width设置宽度android:layout_height设置高度
在Android中还提供了一个可以与VideoView组件结合使用的MediaController组件。MediaController组件用于通过图形控制界面来控制视频的播放。 例 activity_main.xml
?xml version1.0 encodingutf-8?
RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivity
VideoViewandroid:idid/main_vv1android:layout_widthmatch_parentandroid:layout_heightmatch_parent/
/RelativeLayout
MainActivity.java
package com.example.videoviewandmediacontroller;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.view.WindowManager;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
import java.io.File;
public class MainActivity extends AppCompatActivity {
Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBargetSupportActionBar();actionBar.hide();
//设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);VideoView videoView(VideoView) findViewById(R.id.main_vv1);//指定播放模拟器SD卡上的视频文件File filenew File(Environment.getExternalStorageDirectory()/aishang.mp4);//创建android.widget.MediaController对象控制视频的播放MediaController mediaControllernew MediaController(MainActivity.this);
if(file.exists()){//判断要播放的视频文件是否存在videoView.setVideoPath(file.getAbsolutePath());//指定要播放的视频videoView.setMediaController(mediaController);//设置VideoView与MediaController相关联videoView.requestFocus();//让VideoView获得焦点try {videoView.start();//开始播放视频} catch (Exception e) {e.printStackTrace();//输出异常信息}//为VideoView添加完成事件监听器实现视频播放结束后的提示信息videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {Overridepublic void onCompletion(MediaPlayer mediaPlayer) {//弹出消息提示框显示播放完毕Toast.makeText(MainActivity.this, 视频播放完毕, Toast.LENGTH_SHORT).show();}});}else {//弹出消息提示框提示文件不存在Toast.makeText(MainActivity.this,要播放的视频文件不存在, Toast.LENGTH_SHORT).show();}}
}
AndroidManifest.xml
uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE/uses-permission android:nameandroid.permission.MOUNT_UNMOUNT_FILESYSTEMStools:ignoreProtectedPermissions /
AndroidManifest.xml的application节点下
android:requestLegacyExternalStoragetrue 4.难点解答
4-1.MediaPlayer 与SoundPool的区别
使用MediaPlayer每次只能播放一-个音频适用于播放长音乐或是背景音乐使用SoundPool可以同时播放多个短小的音频而且占用的资源较少适用于播放按键音或者消息提示音等。
4-2.MediaController 的作用
MediaController是一个与MediaPlayer相匹配的Android控件它主要集合了媒体播放器的控制功能用于控制MediaPlayer播放状态的同步。通常包含“播放/暂停”“后退”“快进”和进度滑块等按钮。实例化此类后MediaController 将创建一组默认的控件 并且浮动在界面的最上层。如果空闲3秒钟窗口将消失当用户触摸锚定视图时窗口将重新出现。