精华内容
下载资源
问答
  • Android assets res简单梳理
    Android的资源文件大致可以分为两类:
    1,res目录下存放的可编译的资源文件。
         该资源文件会以相应的ID被映射到R.java文件,通过对应的资源ID:R.id.name可实现对该资源的访问。
         使用方式:
         InputStream is=context.getResources().openRawResource(R.id.name);
    2,assets目录文件,该目录下的文件可以有自己的文件目录,同时系统在编译时是不会编译的该目录的文件,访问的时候需要使用AssetManager类,通过I/O流的方式对该目录中的文件进行读写。
         InputStream is = context.getAssets().open("config/ui.txt");  //实际路径--> /assets/config/ui.txt

    注意:

    1.res和assets目录下资源文件只能以InputStream方式读取

    2.所有资源文件都是只读的,运行时无法修改

    3.所有资源文件夹assetsres也都是只读的,不可写入,Apk在编译后无法修改

    4.如果想对资源文件进行修改,可对文件进行copy建立temp(临时文件),对临时文件进行修改,再使用,用到了java Io流的方法 File.createTempFile();

    5.对于资源文件大小限制的说明Android系统对资源文件(res/rawassets文件夹下)的大小有限制,2.3之前默认最大仅支持1M的文件2.3之后貌似<=10M

    6,存放在res和asset目录下的文件都会被打包到发布包中。
    7,assets目录下的文件在打包成apk时是不会进行压缩的;res下的文件在打包成apk时会进行小内存的优化。
    展开全文
  • Android assets的一个bug

    2014-01-14 14:02:53
    Android assets目录下资源文件超过1MB的问题。 由于要显示一些奇奇怪怪的日文字符,我们在应用里放了一个字库文件,譬如叫做jp.ttf,放在assets目录下打包。 开发、调试一切正常。可是突然发现,...

    摘要
    Android assets目录下资源文件超过1MB的问题。

    由于要显示一些奇奇怪怪的日文字符,我们在应用里放了一个字库文件,譬如叫做jp.ttf,放在assets目录下打包。

    开发、调试一切正常。可是突然发现,在Android 2.2的设备上,文字无法显示。折腾一番后发现了一些故事,也产生了更多疑问。

    1. 放在assets目录下的资源文件不会被映射到R.java,访问需要AssetManager类。不同于res/rawres/raw中的资源文件会被映射到R.java,访问时使用资源ID。

    2. 能搜索到很多网页(但内容几乎相同)指出AssetManager有个bug,不能处理单个超过1MB的文件。但没有说明Android版本。从我们对这个字库的使用来看,Android 2.3以上没有问题。

    3. 找到Android Issue 39041提到AssetManager的一个问题,回复中5楼bite…@gmail.com说,

      There is a bug in apk de/compression that does not allow using compressed assets which unpack into files larger than 1 mb. This problem is fixed in Android 2.3.

      不知道他是不是Project Member,在7楼,他又说,

      Android smaller than 2.3 DOES NOT GUARANTEE that loading will succeed. This happens more frequently when there are a lot of similar bytes in a row in the asset file, but not necessary. To be sure you have to split the resource file into small files, that’s it.

      而Project Member kr…@android.com说,

      Also, do not read files a single byte at a time. Use a large byte buffer.

      不知道这里“a large byte buffer”要求达到多少。我们的字库文件jp.ttf是超过1MB了,确实也只在Android 2.2上遇到问题。而我们的应用又必须支持Android 2.2。

    4. 又折腾一番后我们发现,把这个jp.ttf改名为jp.xmf,在Android 2.2上就可以正常访问了。

    5. 无论文件后缀名是啥,访问方法是一样的,

      InputStream in = getResources().getAssets().open("jp.xmf");

      第3点里提到的“a large byte buffer”建议得到了验证,应用里由于某种原因需要把这个文件读到一个buffer里再写到另一个路径,这个buffer是1KB,如果调整成1MB,jp.ttf就也可以正常访问了。最初,是这样访问的,

      tf = Typeface.createFromAsset(getAssets(), "jp.xmf");

      还是不清楚为什么jp.xmf可以工作,jp.ttf不行?

    更新,12月23日。知道了为什么jp.xmf可以工作,jp.ttf不行。这个问题可能是试图访问在打包apk时被压缩的资源文件而产生的,因此解决方法确实是改文件后缀名,改成不会在打包apk时被压缩的后缀名。譬如mp3、jpg,或者我们曾经尝试过的xmf。感谢这个提问CommonsWare的回答。

    同时,我们也发现之前“5”中的结论是错误的,对于jp.ttf,在Android 2.2上增大buffer没有解决问题。可能当时验证的小伙伴一时糊涂用错了手机。关于1MB的问题,还可以参考这个提问

    展开全文
  • Android assets详解

    千次阅读 2014-05-22 22:50:16
    /res 和/assets的不同点是,android不为/assets下的文件生成ID。如果使用/assets下的文件,需要指定文件的路径和文件名。 二:assets目录下文件的读取 1.读取readme。txt文件的内容 ...

    提纲:

    一:assets目录介绍

    二:assets目录下文件的读取

    1.读取readme。txt文件的内容

    2.读取文件名

    3.转移assets的一个db文件到数据库


    一:assets目录介绍

    Android 系统为每个新设计的程序提供了/assets目录,这个目录保存的文件可以打包在程序里。/res 和/assets的不同点是,android不为/assets下的文件生成ID。如果使用/assets下的文件,需要指定文件的路径和文件名。


    二:assets目录下文件的读取

    1.读取readme。txt文件的内容

    		AssetManager assetManager = this.getAssets();
    		AssetInputStream is = null;
    		try {
    			//通过文件名获取数据流,txt文件数据要为UTF-8类型,否则会出现乱码,可在eclipse
    			//里通过修改文件属性更改
    			is =  (AssetInputStream) assetManager.open("readme.txt");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		//将输入流读取的内容转为String类型
    		ByteArrayOutputStream out = new ByteArrayOutputStream();
    		byte[] buffer = new byte[1024];
    		int len = -1;
    		try {
    			while((len =is.read(buffer))!=-1){
    				out.write(buffer, 0, len);
    			}
    			out.close();
    			is.close();
    		} catch (IOException e) {
    			
    		}
    		tv1.setText(out.toString());

    2.读取文件名

    		String[] fileName = null; 
    		try {
    			fileName = assetManager.list("image");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		tv2.setText(fileName[0]+",   "+ fileName[1]);


    3.转移assets的一个db文件到数据库

    		String targetFileName = "/data/data/"+this.getPackageName()+"/databases/base.db";
    		copyFileForAssrts(this, "base.db", targetFileName);
    		SQLiteDatabase db = openOrCreateDatabase("base.db", 0, null);
    		Cursor cursor = db.rawQuery("select area_id from geo where name_cn =?", new String[]{"武汉"});
    		String area_id = null;
    		while(cursor.moveToNext()){
    			area_id = cursor.getString(cursor.getColumnIndex("area_id"));
    		}
    		tv3.setText("获取天气的武汉区域id:"+area_id);
    	private void copyFileForAssrts(Context context,String assetsFileName, String targetFileName){
    		FileOutputStream outStream = null;
    		AssetInputStream is = null;
    		try {
    			File file = new File(targetFileName);
    			if(file.exists())
    				file.delete();
    			
    			createMultPath(file.getParentFile().getAbsolutePath());
    			file.createNewFile();
    			outStream = new FileOutputStream(file);
    			is = (AssetInputStream) context.getAssets().open(assetsFileName);
    			
    			byte[] buffer = new byte[1024];
    			int len = -1;
    			while((len = is.read(buffer))!=-1){
    				outStream.write(buffer, 0, len);
    			}
    			outStream.flush();		
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally{
    			try {
    				is.close();
    				outStream.close();
    			} catch (IOException e) {
    			}
    			
    		}
    	}
    	// 创建目录
    	public static void createMultPath(String path) {
    		StringTokenizer st = new StringTokenizer(path, "/");
    		String path1 = st.nextToken() + "/";
    		String path2 = path1;
    		while (st.hasMoreTokens()) {
    			path1 = st.nextToken() + "/";
    			path2 += path1;
    			File inbox = new File(path2);
    			if (!inbox.exists())
    				inbox.mkdir();
    		}
    	}

    对于assets目录下的文件,知道第1个方法就够了,因为这些文件名你肯定知道,然后在通过流来转换成不同形式显示出来就够了。

    展开全文
  • Android Assets工具类

    2017-12-08 16:40:02
    Assets工具类1. Assets简介Android 中...第二种就是放在assets文件夹下面的原生资源文件,放在这个文件夹下面的文件不会被R文件编译,所以不能像第一种那样直接使用.Android提供了一个工具类,方便我们操作获取assets

    Assets工具类

    1. Assets简介

    Android 中资源分为两种:

    1. 一种是res可编译的资源文件, 这种资源文件系统会在R.java里面自动生成该资源文件的ID,访问也很简单,只需要调用R.XXX.id即可
    2. 第二种就是放在assets文件夹下面的原生资源文件,放在这个文件夹下面的文件不会被R文件编译,所以不能像第一种那样直接使用.Android提供了一个工具类,方便我们操作获取assets文件下的文件:AssetManager。

    AssetManager

    AssetManager提供了如下方法用于处理assets:

    //列出该目录下的下级文件和文件夹名称
    String[] list(String path);
    
    //以顺序读取模式打开文件,默认模式为ACCESS_STREAMING
    InputStream open(String fileName);
    
    //以指定模式打开文件。读取模式有以下几种:
    //ACCESS_UNKNOWN : 未指定具体的读取模式
    //ACCESS_RANDOM : 随机读取
    //ACCESS_STREAMING : 顺序读取
    //ACCESS_BUFFER : 缓存读取
    InputStream open(String fileName, int accessMode);
    
    //关闭AssetManager实例
    // 注意: getAssets()得到的AssetManager 不要close,因为这个AssetManager还会被系统使用。
    void close()

    注意: getAssets()得到的AssetManager 不要close,因为这个AssetManager还会被系统使用。

    2. Assets工具类结合Gson获取实体类对象

    Android开发中,有时候在后台服务没有做好的情况下,我们需要在前端调UI,所以就需要创建假数据,即实体类对象,用来模拟在网络获取的实体类对象。所以,我们可以在本地assets文件夹下放一个文本文件,用来存放一个假的数据,然后结合Assets相关API,读取改文件并解析为实体类。

    本案例中使用json来传递数据,并使用Google的开源库Gson来解析Json。

    具体代码为:

    public final class AssetsUtils {
    
        private AssetsUtils() {
            throw new UnsupportedOperationException("u can't instantiate me...");
        }
    
        /**
         * 从文件中获取字符串
         *
         * @param fileName
         * @param context
         * @return
         */
        public static String getString(String fileName, Context context) {
            StringBuilder stringBuilder = new StringBuilder();
            try {
                AssetManager assetManager = context.getAssets();
                BufferedReader bf = new BufferedReader(new InputStreamReader(
                        assetManager.open(fileName)));
                String line;
                while ((line = bf.readLine()) != null) {
                    stringBuilder.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }
    
        /**
         * 根据字符串返回实体类
         *
         * @param fileName
         * @param context
         * @param tClass
         * @param <T> 实体类
         * @return
         */
        public static <T>  T getJsonObject(String fileName, Context context, Class<T> tClass) {
            String jsonStr = getString(fileName, context);
            Gson gson = new Gson();
            return gson.fromJson(jsonStr, tClass);
        }
    }

    首先,通过getString方法,获取文件的字符串,然后,通过泛型方法getJsonObject,来将解析字符串,转换为实体类对象。

    DemoActivity为AssetsActivity。对应实体类代码为:RepositoriesBean。可以使用AS的插件GsonFormat来自动生成。Activity代码为:

    public class AssetsActivity extends BaseActivity {
        private static final String TAG = "AssetsActivity";
    
        private static final String REPOSITORIES_FILE_NAME = "github_repositories.json";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_assets);
            testJsonObject();
        }
    
        /**
         *
         */
        private void testJsonObject() {
            RepositoriesBean repositoriesBean = AssetsUtils.getJsonObject(REPOSITORIES_FILE_NAME,
                    AssetsActivity.this, RepositoriesBean.class);
    
            boolean incomplete_results = repositoriesBean.isIncomplete_results();
            int total_count = repositoriesBean.getTotal_count();
            List<RepositoriesBean.ItemsBean> items = repositoriesBean.getItems();
    
            LogUtils.d(TAG, "testJsonObject, incomplete_results: " + incomplete_results
                    + "\ntotal_count: " + total_count
                    + "\nitems.size(): " + items.size());
    
        }
    
    
    }

    该Demo使用Github的搜索仓库API的返回结果作为实体类。更多Github API的内容请参考GitHub API 学习笔记 Search APIGithub 开发官方地址

    参考:

    Android中读取assets目录下的文件详细介绍

    展开全文
  • Android assets资源读取

    万次阅读 2016-07-18 15:35:43
    因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们。那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,以apk形式存在,asset/...
  • android assets文件路径

    2019-12-29 17:14:48
    public String getAssetsCacheFile(Context context,String fileName) { File cacheFile = new File(context.getCacheDir(), fileName); try { InputStream inputStream = context.getAssets().o...
  • // 读取Android Assets文本文件中的内容 public String ReadTxtFile(String filename) { InputStream fis = null; try { fis = this.getResources().getAssets().open(filename); } catch (IOException e1...
  • android Assets文件夹下的文件路径

    千次阅读 2020-03-17 15:04:31
    file:///android_asset/font/daimeng_6.ttf 这里需要注意一个比较坑的一点,就是,如果把上方的daimeng_6.ttf直接放在assets目录下方,这个路径是找不到daimeng_6.ttf这个文件的,因此,用这种路径一定要把要用到的...
  • android assets与raw资源

    2016-09-22 11:37:00
    1 assets assets文件夹资源的访问  assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。 1.1 步骤  1. 先在Activity里面调用getAssets() 来获取AssetManager引用。  2. ...
  • Androidassets文件夹的放置位置,Eclipse创建项目时就生成了的,Android Studio则不太一样,AS可以包含几种方式, 1:可以在build.gradle文件下配置,加如下代码  " sourceSets {main {assets.srcDirs = ['src/...
  • android assets和raw的区别

    千次阅读 2017-08-05 18:14:14
    Android工程的目录下,/assets是应用系统内部需要使用到的诸如音乐、视频类文件,而/res是应用的资源文件,/res内有一个/raw目录,这个目录和/assets有类似,这里记录一下两者的异同和用法。/res/raw和/assets的...
  • Android工程目录下,有assets和res/raw文件夹,它
  • 最近在做从assets读取大文件中的片段内容,在以前读取sd卡文件使用FileInputStream很快,但是在切换到assets的InputStream就慢得抓狂了。。 究其原因是skip 的问题,废话不多讲,让assets的文件能以FileInputStream...
  • android assets 文件读取

    千次阅读 2014-03-14 14:07:53
    assets文件夹资源的访问  assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。  1. 先在Activity里面调用getAssets() 来获取AssetManager引用。  2. 再用...
  • android assets目录文件操作

    千次阅读 2018-05-10 17:58:13
    之前的apk的assets目录下有些文件要删除,就想在新的版本上线的时候写段代码删除,可是怎么尝试都做不到,为什么呢?哈哈哈,一句话启发了我查找api发现只有访问读取assets目录文件的方法,就是没有删除的,原来官方...
  • Android assets, raw

    千次阅读 2014-03-25 10:51:54
    之前遇到一个问题,就是把Android工程中的assets目录下的文件夹或者文件拷贝到应用的data/data/com.xxx.yyy/目录下,一般这种需求的情况是,在assets中预置数据,因为这里的数据是不会被压缩的,而是保持文件原有的...
  • Android assets 和 res/raw 区别。读取本地网页,读取文本字体样式,读取视频。 res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 res/raw和assets的...
  • Android assets目录资源读取

    万次阅读 2015-03-11 14:02:29
    Android 应用程序内置资源放到assets文件夹下,可在里面新建目录,注意资源和目录不能有中文,获取资源的方法如下: 1. 用getResources().getAssets()方法得到AssetManager对象 2. assetManager.list("") 得到...
  • 大家都知道建立一个Android项目后会产生assets与res的两个文件夹,理论上他们都是存放资源的文件夹,那么他们到底有什么区别呢? 1.assets:不会在R.java文件下生成相应的标记,存放到这里的资源在运行打包的时候...
  • android assets目录下的资源读取

    千次阅读 2017-11-15 06:12:50
    Android开发之assets目录下资源使用总结  android系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们。  apk安装之后会放在/data/app/**.apk目录下,以apk形式存在, ...
  • Android assets文件夹资源的访问

    千次阅读 2017-06-29 14:18:06
    assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。  1. 先在Activity里面调用getAssets() 来获取AssetManager引用。  2. 再用AssetManager的open(String ...
  • 访问图片文件es01.jpg的绝对路径为 assets/pic/es01.jpg Image image = .... image.setImageURI(Uri.parse(" assets/pic/es01.jpg")); 
  • Android assets 目录介绍和应用     说明: 1、文章转自:http://blog.toeach.net/2010/04/04/using-assets-in-android/ 2、对原文的修改:增加注释,原英文已经翻译。 3、程序经过调试...
  • Android Assets文件大小限制

    千次阅读 2012-06-13 17:09:14
    Android Asset Packaging Tool(aapt)使用这个工具可打包所有数据Image XML文件任何资源文件.在生成APK时aapt选择性的压缩各种资源来节省设备空间,aapt使用后缀来决定哪个资源需要压缩,aapt源码定义一些不需要压缩...
  • android assets 下文件中文乱码解决

    千次阅读 2016-03-09 14:38:48
    1、问题原因:文件存编码格式和读取格式不一样 2、解决:统一为utf8格式 步骤: 1、将读取出现乱码的文件另存为UTF-8格式  2、在客户端读取时,使用UTF-8格式读取: ...StringBuilder sb = new StringBuilder();...
  • android assets 的说明与应用

    千次阅读 2012-05-03 16:24:47
    Android 系统为每个新设计的程序提供了/assets目录,这个目录保存的文件可以打包在程序里。/res 和/assets的不同点是,android不为/assets下的文件生成ID。如果使用/assets下的文件,需要指定文件的路径和文件名。 ...
  • Android Assets目录的读和删除文件操作

    千次阅读 2017-08-04 15:41:58
    用输入流获得一个资源: InputStream inputStream = getResources().getAssets().open(“logo.png”); imageView.setImageBitmap(BitmapFactory.decodeStream...//获得Assets/files目录,Assets/files里的files

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,852
精华内容 23,540
关键字:

androidassets