安卓权威编程指南 -笔记(18章 处理assets)
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)的更多相关文章
- 安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...
- 安卓权威编程指南-笔记(第21章 XML drawable)
在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable ...
- 安卓权威编程指南-笔记(第27章 broadcast intent)
本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent ...
- 安卓权威编程指南-笔记(第23章 HTTP与后台任务)
1. 网络连接基本 //通过指定URL获取原始数据,并返回一个字节流数组. public byte[] getUrlBytes(String urlSpec)throws IOException{ / ...
- 安卓权威编程指南-笔记(第22章 深入学习intent和任务)
本章,我们会使用隐式intent创建一个替换android默认启动器的应用.名为NerdLauncher. NerdLauncher应用能列出设备上的其他应用,点选任意列表项会启动相应应用. 1. 解 ...
- 安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)
AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做 ...
- 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)
针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具. SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件.因此所以,就算用户兴奋起来,狂按按钮播放全部音频, ...
- 安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)
26.11 挑战练习:在 Lollipop 设备上使用 JobService 请创建另一个 PollService 实现版本.新的 PollService 应该继承 JobService 并使用 Jo ...
- 安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用
你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示 ...
随机推荐
- python画图例子代码
matplotlib包,使得python可以使用类似matlab的命令 双坐标,子图例子 fig, axes = plt.subplots( 2,1, figsize=(14, 14) ) ax = ...
- python的稀疏矩阵计算
尽量避免稀疏矩阵, 加快计算. 比如计算稀疏矩阵S的F范数 a = norm(S, 'fro'), 方法1效率比方法2高很多. 方法 1 import numpy as np a = np.linal ...
- 从git上拉取项目 如果数据库密码不一致 会报错 500
解决方法 在该路径下设置 数据库的密码
- Fiddler 之Filters
转自: https://blog.csdn.net/willcaty/article/details/70144287 Filters功能可以过滤捕获到的Sessions 入口在Fiddler工具的右 ...
- EMD——EEMD——CEEMD语音增强算法基础
首先,HHT中用到的EMD详细介绍:https://wenku.baidu.com/view/3bba7029b4daa58da0114a9a.html 本文具体参考 https://zhuanlan ...
- RubyMain2016.2配置自动同步代码到服务器功能
可以参考rubymain帮助文档:https://www.jetbrains.com/help/ruby/deployment-in-rubymine.html 在rubymain工具的Tools&g ...
- linux上部署jenkins
http://www.pianshen.com/article/1133171043/相关jenkins链接 下载jenkins的war包:https://blog.csdn.net/Aaron_Zh ...
- C++类和对象到底是什么意思?
C++ 是一门面向对象的编程语言,理解 C++,首先要理解类(Class)和对象(Object)这两个概念. C++ 中的类(Class)可以看做C语言中结构体(Struct)的升级版.结构体是一种构 ...
- python面向对象小tips
(一).python鸭子类型 python作为动态语言继承和多态与静态语言(像java)有很大的不同:比如说在java中的某个方法,如果传入的参数是Animal类型,那么传入的对象必须是Animal类 ...
- 查看pip安装的包的位置