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. 8.windows-oracle实战第八课 --管理权限和角色

    权限:      如果要执行某种特定的数据库操作,就要赋予系统的权限:      如果要执行访问其他方案的对象,就要赋予对象的权限. 1.创建ken和tom用户 create user ken ide ...

  2. 《后端也要懂一点前端系列》使用webpack搭建项目

    今天突然有兴致想要学习一下前端的技术,所以特此记录学习前端之路.由于之前在公司做的项目大部分都是关于JSP页面的增删改查,所以前端后端都是一个人来写的,对于前端还只是停留在js.html.css阶段, ...

  3. cookbook of python for data analysis

    打算写讲义,目录已经想好. Content basic of python jupyter 开发环境 python 基本语法 利用python脚本完成工作 numpy for matrix compu ...

  4. python代码技术优化

    numba 编译优化 from numba import jit @jit def eval_mcc(y_true, y_prob, threshold=False): idx = np.argsor ...

  5. 内网部署Docker版本Gitlab

    Gitlab部署: 1. 还原备份文件后记得拷贝gitlab-secrets.json,不然会遇到500错误 2. 下载Docker以及依赖项rpm包 3. 在外网机器下载镜像 a. 拉取——Dock ...

  6. F 乘法(第k大问题)(二分)

    题:https://ac.nowcoder.com/acm/contest/3979/F 题意:俩个序列俩俩相乘得到n*m个数,求第k大的数是哪个 分析:二分 #include<bits/std ...

  7. Windows环境搭建 face_recognition,dlib

    文章参考:https://blog.csdn.net/hongbin_xu/article/details/76284134 文章参考:https://blog.csdn.net/weixin_404 ...

  8. K - Wand(组合数+错排公式)

    N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...

  9. SLIQ/SPRINT

    SLIQ/SPRINT */--> SLIQ/SPRINT Before SLIQ, most classification alogrithms have the problem that t ...

  10. auto uninstaller (autodesk 修复大师) 简体中文版 更新下载地址

    小伙伴是不是遇到 CAD/3dmax/maya/Revit/Inventor 安装失败或者安装不了的问题了呢?AUTODESK系列软件着实令人头疼,CAD/3dmax/maya/Revit/Inven ...