安卓权威编程指南 -笔记(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 视图(回到只显示 ...
随机推荐
- POJ-2349 Arctic Network(最小生成树+减免路径)
http://poj.org/problem?id=2349 Description The Department of National Defence (DND) wishes to connec ...
- 1.Jenkins基本安装及插件离线安装
Jenkins基本安装 Jenkins官方地址:https://jenkins.io/zh/,下载最新版本,需要依赖对应的jdk版本才可以正常运行. dockerfile文件构建docker镜像 FR ...
- jenkins推送docker镜像到远程仓库
参考链接:https://blog.csdn.net/qq_34252622/article/details/92791262
- APUE 书中 toll 函数
今天看unix环境高级编程时,随着书上的源码打了一遍,编译时提示 toll函数未定义, 找了半天(恕我对上下文不了解).看了英文版和源代码文件才知道, 中文版打印错了: toll => atol ...
- Spring Boot 2.x 整合 Redis最佳实践
一.前言 在前面的几篇文章中简单的总结了一下Redis相关的知识.本章主要讲解一下 Spring Boot 2.0 整合 Redis.Jedis 和 Lettuce 是 Java 操作 Redis 的 ...
- 6)HTML中a链接跳转地址怎么写
(1)看 thinkphp5的 附录--->助手函数 --->url 利用url进行书写地址跳转: 比如,你想跳转到cate控制器下的lst方法: <a href=" ...
- 吴裕雄--天生自然C语言开发:错误处理
#include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int m ...
- Listening-lecture|主旨题|术语解释|举例原则|Crash course 哔哩哔哩
Listening-lecture: Major topic: SP1---detail---detail---detail SP2---detail---detail---detail Crash ...
- SpringBoot1.X /2.X使用@Component注解注入为java.lang.NullPointException 问题小结
问题简述: 我们在使用Spring系的产品的时候总是想当然的以为所有指定的Bean都会让Spring来管理,其实不然,即使是Spring出品的产品也不全是的哦,以下是我遇到的一个使用@Componen ...
- Reading
Reading一共18min 需要背诵专业学科分类的词汇. 单词上,背四级词汇和托福词汇,达到约1w词汇. 句子上,练习速度和用词准确,其中准确包括含义准确和语序准确.