Android之资源打包方式——Assets

Android资源系统(resources system)可以用来打包应用所需的图片、XML文件以及其他非Java资源,这里来学习下另一种资源打包方式:assets。

resources资源可以存储声音文件,比如在res/raw目录可以保存xxx.wav文件,然后使用R.raw.xxx来获取它。然而,《Android编程权威指南》中的事例BeatBox项目,涉及到了20个多不同声音文件处理,若使用Android资源系统一个个处理,效率就会很低,这个时候,assets就派上用场了,assets可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构,因为这个优点,类似游戏这样需要加载大量图片和声音资源的应用通常都会使用它。下面来学习怎么读取assets资源。这里的Demo就不用书上同样的了,为了学习assets,就自己随意写了个Demo。

首先导入assets(创建assets目录,我用AS新建一个项目,貌似是没有自动生成assets文件夹的,因此,邮件单击app模块,New->Folder->Assets Folder)

Demo截图
跳出下图,然后finish
Demo截图
项目就出现了assets
Demo截图
右键单击assets目录,这里可以将文件直接放入assets目录下,也可以再建立一个文件夹,统一管理。我们这里建立example文件夹,放入几个txt文件
Demo截图

    private static final String TAG = "AssetDemoActivity";
    private static final String EXAMPLE_FOLDER = "example";
    private AssetManager mAssets;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_asset_demo);
        mAssets = this.getAssets();
        try {
            String[] examples = mAssets.list(EXAMPLE_FOLDER);
            Log.i(TAG, "ALL:" + examples.length);
            for (String example: examples){
                Log.i(TAG, "Name:" + example);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

打印结果:
Demo截图

assets目录中的所有文件都会随应用打包。访问assets需要用到AssetManager类,可以从Context中获取它,通常,在访问assets时,可以不用关心究竟使用哪个Context对象,实际开发中,所有Context中的AssetManager管理的都是同一套assets资源。AssetsManager.list(String)方法能列出指定目录中的所有文件名。

当然要得到assets中资源的内容,就要用到文件读取的技术了,首先要得到资源文件的路径喽,上述Demo得到路径的方式:

String assetPath = EXAMPLE_FOLDER + "/" + example;
InputStream assetData = mAssets.open(assetPath);

得到标准的InputStrem数据流,然后,就该怎么用就怎么用啦,有的API可能还会需要FileDescriptor。改调用AssetManager.openFd(String)方法就可以了。

深入理解:什么是non-assets
AssetManager类还有openNonAssetFd(...)这样的方法。Android有assets和resources两大资源系统。resources资源系统设计有良好的检索系机制,但它无法应付图形和声音文件这样的大文件。这些资源实际是保存在assets系统里的。在后台,Android就是使用openNonAsset方法来打开这些资源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android与资源管理相关的类Resouces和AssetManager很有必要清楚他们的创建过程。 与资源查找...
    小爨阅读 3,291评论 4 14
  • Assets资源 assets/和res/raw目录 相同之处 两者目录下的文件在打包后会原封不动的保存在apk包...
    狮_子歌歌阅读 16,705评论 1 10
  • Android提供了一种非常灵活的资源系统,可以根据不同的条件提供可替代资源。因此,系统基于很少的改造就能支持新特...
    Gooooood阅读 13,012评论 5 25
  • 一生都不会停止画画。 不为名气不为利益,只是单纯的热爱。 喜欢去哪都带一本速写本一支笔,放进大大单肩包里。 关于艺...
    DAI雨惜阅读 272评论 0 4
  • 来源:教育科学学院 19预文一班陆琴 相信自己是一种信念,它不是繁花如梦似锦,却又如青松雪压不倒。自信能让自己有无...
    教科院团总支学生阅读 147评论 0 0