resources资源可以存储声音文件,但当处理多个音乐文件时,效率会很低。

assets可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构。类似游戏这样需要加载大量图片和声音资源的应用通常都会使用它

1. 导入assets

在app模块下创建assets目录,然后建立需要的资源文件夹并放入资源。

2. 处理assets

assets导入后,我们还要能在应用中进行定位,管理记录,以及播放,这需要新建一个名为 BeatBox 的资源管理类。代码如下:

 public class BeatBox {

     //用于日志记录
private static final String TAG = "BeatBox"; //用于存储声音资源文件目录名
private static final String SOUNDS_FOLDER = "sample_sounds"; //访问assets需要用到AssetManager类,可以从context中获取到它,这里添加一个带Contex参数的构造函数获取并留存它。
private AssetManager mAssets; public BeatBox(Context context){
/*
* 访问assets时,可以不用关心究竟使用哪个Contex对象,
* 而且在实际开发的任何场景下,所有Context中的AssetManager管理的都是同一套assets资源。
*/
mAssets = context.getAssets();
loadSounds();
} private void loadSounds(){
String[] soundNames;
try{
//list(S)方法取得assets中的资源清单。能够列出指定目录中的所有文件名。
//只要传入声音资源所在的目录,就能看到其中所有的.wav文件。
soundNames = mAssets.list(SOUNDS_FOLDER);
Log.i(TAG, "Found "+ soundNames.length + " sounds");
}catch (IOException ioe){
Log.e(TAG, "Could not list assets",ioe );
return;
}
}
}

3. 使用Assets

获取到资源文件名之后,要讲其展示给用户,最终还需要播放这些声音文件,所以,我们得创建一个对象,让它管理资源文件名,用户应该看到的文件名以及其他一些相关信息。

创建一个Sound管理类。

 public class BeatBox {

     //用于日志记录
private static final String TAG = "BeatBox"; //用于存储声音资源文件目录名
private static final String SOUNDS_FOLDER = "sample_sounds"; //访问assets需要用到AssetManager类,可以从context中获取到它,这里添加一个带Contex参数的构造函数获取并留存它。
private AssetManager mAssets; //创建一个Sound列表
private List<Sound> mSounds = new ArrayList<>(); public BeatBox(Context context){
/*
* 访问assets时,可以不用关心究竟使用哪个Contex对象,
* 而且在实际开发的任何场景下,所有Context中的AssetManager管理的都是同一套assets资源。
*/
mAssets = context.getAssets();
loadSounds();
} private void loadSounds(){
String[] soundNames;
try{
//list(S)方法取得assets中的资源清单。能够列出指定目录中的所有文件名。
//只要传入声音资源所在的目录,就能看到其中所有的.wav文件。
soundNames = mAssets.list(SOUNDS_FOLDER);
Log.i(TAG, "Found "+ soundNames.length + " sounds");
}catch (IOException ioe){
Log.e(TAG, "Could not list assets",ioe );
return;
} for(String fileName : soundNames){
String assetPath = SOUNDS_FOLDER + "/" + fileName;
Sound sound = new Sound(assetPath);
mSounds.add(sound);
}
} public List<Sound> getSounds(){
return mSounds;
}
}

4. 访问Assets

Sound对象定义了assets文件路径,尝试使用File对象打开资源文件是行不通的,正确的方式是使用AssetManager:

String assetPath = sound.getAssetPath();

InputStream sounData = mAssets.open(assetPath);  //这样就得到了标准的InputStream数据流,随后,和java中的其他InputStream一样,该怎么用就怎么用。

不过有些API可能还会需要FileDescriptor。只需要改为调用AddetManager.openFd(String)方法就行了。

String assetPath = sound.getAssetPath();

AssetFileDescriptor assetFd = mAssets.openFd(assetPath);

FileDescriptor fd = assetFd.getFileDescriptor();

安卓权威编程指南 -笔记(18章 处理assets)的更多相关文章

  1. 安卓权威编程指南 - 第五章学习笔记(两个Activity)

    学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...

  2. 安卓权威编程指南-笔记(第21章 XML drawable)

    在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable ...

  3. 安卓权威编程指南-笔记(第27章 broadcast intent)

    本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent ...

  4. 安卓权威编程指南-笔记(第23章 HTTP与后台任务)

    1. 网络连接基本 //通过指定URL获取原始数据,并返回一个字节流数组. public byte[] getUrlBytes(String urlSpec)throws IOException{ / ...

  5. 安卓权威编程指南-笔记(第22章 深入学习intent和任务)

    本章,我们会使用隐式intent创建一个替换android默认启动器的应用.名为NerdLauncher. NerdLauncher应用能列出设备上的其他应用,点选任意列表项会启动相应应用. 1. 解 ...

  6. 安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)

    AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做 ...

  7. 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)

    针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具. SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件.因此所以,就算用户兴奋起来,狂按按钮播放全部音频, ...

  8. 安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)

    26.11 挑战练习:在 Lollipop 设备上使用 JobService 请创建另一个 PollService 实现版本.新的 PollService 应该继承 JobService 并使用 Jo ...

  9. 安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用

    你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示 ...

随机推荐

  1. 使用XAMPP集成开发环境安装Apache、PHP的配置说明

    一.安装XAMPP 双击安装包xamppinstaller.exe,可完成XAMPP的安装,与其他软件安装并无区别. 二.配置Apache端口,使用其可以正确启动 点击Start,启动Apache时可 ...

  2. 解决 Win7 远程桌面 已停止工作的问题

    Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...

  3. Regex: positive lookahead 先行断言____ 后行断言(lookbehind)

    先行断言: /a(?=b)/  ,positive lookahead,a的后方必须是b才行 /a(?!b)/   ,negative lookahead,a的后方必须不是b才能匹配 如下图示:  来 ...

  4. [USACO09OCT]谷仓里的回声Barn Echoes(hush、STL)

    https://www.luogu.org/problem/P2957 题目描述 The cows enjoy mooing at the barn because their moos echo b ...

  5. python语法基础-网络编程-HTTP协议

    ###############    HTTP协议    ############## """ 当你在浏览器地址栏敲入“http://www.cnblogs.com/”, ...

  6. Codeforces1301D Time to Run

    (搬运一下部分官方题解) Description link 或者洛谷link 到时候就有中文翻译了,不过这个题机翻没毛病 Solution 首先这是一道模拟题-- 不要管题目中的循环移动的问题,直接按 ...

  7. string判断是否是正常的ip格式

    废话不多说,上代码 bool isCurrectIP(char *ip) { if (ip == NULL) { return false; } char temp[4]; int count = 0 ...

  8. wait操作接口

    1.等待回收的两个函数wait()和waitpid()函数 1.1 wait(int *status)的用法:阻塞函数,等待任意一个子进程的返回.   *wait(NULL):对子进程的结束状态不关心 ...

  9. CLOUD列表字段数据汇总

  10. Robustness|Variability|Diversification|Complexity|自组装|

    生命组学 进化方向有以下四个特性:Robustness:变稳定,比如杀虫剂最大浓度也有杀不死的虫子.Variability易变性与Diversification多样性,容易变多和变多.Complexi ...