美文网首页
Android 资源-raw和assets

Android 资源-raw和assets

作者: jacky123 | 来源:发表于2016-09-28 18:24 被阅读164次

前言

这几天遇到了一个坑!关于resource相关的操作。具体的需求是:替换所有班级的logo,但是移动端android和ios没有建立协议,所以临时采用的是直接上传图片来完成这项任务。当然一个项目有很多人开发,之前的功能已经实现了根据文件的URI来上传具体的File。

问题来了:怎么才能读取到android res 具体的File呢?


认识res

1. res/raw和assets的区别?

  • 共同点:res/raw和assets这两个目录下的文件都会被打包进APK,并且不经过任何的压缩处理。

  • 不同点:assets支持任意深度的子目录,这些文件不会生成任何资源ID,只能使用AssetManager按相对的路径读取文件。如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在assets目录下。


解决问题

copy
可以对Android 的 res 和 assets 里面的文件进行拷贝。我封装了两个方法。

/**
 * copy asset to
 *
 * @param context
 * @param fileName
 */
public static void copyAssetsToOutterByFileName(final Context context, final String fileName) {
    //getFilesDir,指/data/data/<包名>/files/
    final File filedir = new File(context.getFilesDir() + "/classlogo");
    if (!filedir.exists()) {
        filedir.mkdir();
    }

    final File file = new File(filedir, fileName);
    if (file.exists()) {
        Logger.t(TAG).i(fileName + "文件存在,无需拷贝");
        return;
    }
    new Thread() {
        @Override
        public void run() {
            InputStream is = null;
            OutputStream fos = null;
            try {
                is = context.getAssets().open(fileName);
                fos = new FileOutputStream(file);
                //缓存
                byte[] b = new byte[2 * 1024];
                int len;        //每次读的字节数
                while ((len = is.read(b)) != -1) {
                    if (fos != null) {
                        fos.write(b, 0, len);
                    }
                }
                fos.close();
                is.close();
                Logger.t(TAG).i(fileName + "文件拷贝完成");
            } catch (IOException e) {
                Logger.t(TAG).i(fileName + "文件拷贝失败");
                e.printStackTrace();
            } finally {
                closeQuietly(fos);
                closeQuietly(is);
            }
        }
    }.start();
}

/**
 * @param context
 * @param fileName
 * @param type     "drawable" "raw"
 */
public static void copyResToOutterByFileName(final Context context, final String fileName, final String type) {
    //getFilesDir,指/data/data/<包名>/files/
    final File filedir = new File(context.getFilesDir() + "/classlogo");
    if (!filedir.exists()) {
        filedir.mkdir();
    }

    final File file = new File(filedir, fileName);
    if (file.exists()) {
        Logger.t(TAG).i(fileName + "文件存在,无需拷贝");
        return;
    }
    new Thread() {
        @Override
        public void run() {
            InputStream is = null;
            OutputStream fos = null;
            try {
                int resId = context.getResources().getIdentifier(fileName, type, context.getPackageName());
                is = context.getResources().openRawResource(resId);
                fos = new FileOutputStream(file);
                //缓存
                byte[] b = new byte[2 * 1024];
                int len;        //每次读的字节数
                while ((len = is.read(b)) != -1) {
                    if (fos != null) {
                        fos.write(b, 0, len);
                    }
                }
                fos.close();
                is.close();
                Logger.t(TAG).i(fileName + "文件拷贝完成,文件地址:" + file.getAbsolutePath());
            } catch (IOException e) {
                Logger.t(TAG).i(fileName + "文件拷贝失败");
                e.printStackTrace();
            } finally {
                closeQuietly(fos);
                closeQuietly(is);
            }
        }
    }.start();
}

相关文章

  • Android 资源-raw和assets

    前言 这几天遇到了一个坑!关于resource相关的操作。具体的需求是:替换所有班级的logo,但是移动端andr...

  • Android 读取资源文件

    主要介绍 Android 读取资源文件,直接从 assets 读取,从 Raw 文件中读取,InputStream...

  • A007-assets资源

    本节课开始讲Android中所用到的一些资源,首先来讲assets资源,它是Android的其中一种资源,跟raw...

  • Android raw 目录 和 assets 目录

    raw raw 目录是res目录的子目录,所有的文件都必须直接放在raw目录下,raw目录不允许建子目录。 And...

  • Android Resources之assets

    Assets资源 assets/和res/raw目录 相同之处 两者目录下的文件在打包后会原封不动的保存在apk包...

  • A011-Raw资源

    前面的笔者介绍过了assets资源,这节课介绍的是在res目录下的raw资源,路径为res/raw。处理asset...

  • apk打包流程

    aapt资源编译 编译assets目录和res/raw目录下的资源 编译res目录下的资源文件 给res目录下的每...

  • Android Studio增加assets目录、raw目录

    assets与res/raw不同 assets目录是Android的一种特殊目录,用于放置APP所需的固定文件,且...

  • Android中资源文件:assets和raw详解

    assets目录下存放的资源代表应用无法直接访问的原生资源,应用程序需要通过AssetsManager以二进制流的...

  • Android读取配置文件的问题

    注意:Android项目中的配置文件应放在assets或raw目录下,以assets为例: 方法一:URL url...

网友评论

      本文标题:Android 资源-raw和assets

      本文链接:https://www.haomeiwen.com/subject/uhfkyttx.html