随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、QQ技术交流群(183198395)。
类似声音文件及其他各种类型的文件,只要Android没有为之提供专门的支持,这种资源都被称为原始资源。Android的原始资源可以放在如下两个地方:
1、位于/res/raw目录下,Android SDK会在R清单类中为该目录下的资源生成一个索引项,但不会被编译。
2、位于/assets目录下,该目录下的资源是更彻底的原始资源。不会生成索引,更不会被编译,Android应用需要通过AssetManager来管理该目录下的原始资源。AssetManager提供了如下两个常用方法来访问Assets资源:
①InputStream open(String fileName):根据文件名来获取原始资源对应的输入流。
②AssetFileDescriptor openFd(String fileName):根据文件名来获取原始资源对应的描述(AssetFileDescriptor),应用程序可以通过描述来获取原始资源。
本实例中,在raw和assets下各放了一个音频文件,然后在程序中读取出来进行播放控制,代码如下:
Activity:
package com.lovo.activity;
import java.io.IOException;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
MediaPlayer mediaPlayer1 = null;
MediaPlayer mediaPlayer2 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 对于raw里的声音文件,直接根据ID来创建MediaPlayer
mediaPlayer1 = MediaPlayer.create(this, R.raw.raw);
// 对于assets里的声音文件,先获取该应用的AssetManager对象
AssetManager am = getAssets();
try {
// 获取指定文件对应的AssetFileDescriptor对象
AssetFileDescriptor afd = am.openFd("asset.mp3");
mediaPlayer2 = new MediaPlayer();
// 使用MediaPlayer加载指定的声音文件
mediaPlayer2.setDataSource(afd.getFileDescriptor());
mediaPlayer2.prepare();
} catch (IOException e) {
e.printStackTrace();
}
Button playRaw = (Button) findViewById(R.id.main_btn1);
Button playAsset = (Button) findViewById(R.id.main_btn2);
Button stopRaw = (Button) findViewById(R.id.main_btn3);
Button stopAsset = (Button) findViewById(R.id.main_btn4);
playRaw.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 播放声音
mediaPlayer1.start();
}
});
playAsset.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 播放声音
mediaPlayer2.start();
}
});
stopRaw.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 停止播放
mediaPlayer1.stop();
}
});
stopAsset.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 停止播放
mediaPlayer2.stop();
}
});
}
}
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<Button
android:id="@+id/main_btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="播放raw声音" />
<Button
android:id="@+id/main_btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="播放asset声音" />
<Button
android:id="@+id/main_btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止播放raw声音" />
<Button
android:id="@+id/main_btn4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止播放asset声音" />
</LinearLayout>