android 通过switch 方法解析android的assets目录录下的文件怎么做?

Android读取assets目录下的所有图片并显示的方法-爱编程
Android读取assets目录下的所有图片并显示的方法
本文实例讲述了Android读取assets目录下的所有图片并显示的方法。分享给大家供大家参考。具体方法分析如下:
在assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。
1. 先在Activity里面调用getAssets() 来获取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。
3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close() 。
4.调用AssetManager.close() 关闭AssetManager。
需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作。
下面看一下在Activity中使用的示例代码:
复制代码 代码如下:List&Map&String, Object&& cateList = new ArrayList&Map&String, Object&&();&
String[] list_image =&
//得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用&
&&& list_image = context.getAssets().list("processedimages");&
} catch (IOException e1) {&
&&& // TODO Auto-generated catch block&
&&& e1.printStackTrace();&
for(int i=0;i&list_image.++i)&
&&& InputStream open =&
&&& try {&
& String temp = "processedimages/"+list_image[i];&
& open = context.getAssets().open(temp);&
& Bitmap bitmap = BitmapFactory.decodeStream(open);&
& Map&String, Object& map = new HashMap&String, Object&();&
& map.put("name", list_image[i]);&
& map.put("iv", bitmap);&
& map.put("bg", R.drawable.phone_vip_yes);&
& map.put("cate_id",i);&
& cateList.add(map);&
& // Assign the bitmap to an ImageView in this layout&
&&& } catch (IOException e) {&
& e.printStackTrace();&
&&&&& } finally {&
& if (open != null) {&
&&& try {&
&&&&& open.close();&
&&& } catch (IOException e) {&
&&&&& e.printStackTrace();&
这样所有的map中的关键字“iv"处理论上就保存了我们读取的bitmap,可以结果并非如此,大家应该注意到了在”bg“关键字处我们也保存了一个图片,只不过它是通过R.drawable.方式获取的,实验证明这种方式是可以成功读取并显示的。为什么从assets中读取的bitmap不能显示呢?
解决办法是:
实现 ViewBinder接口,对两种的资源id和bitmap 情况进行说明:
复制代码 代码如下:adapter.setViewBinder(new ViewBinder() {&
&&&&&&&&&&&&&
&&& @Override&
&&& public boolean setViewValue(&
&&&& View view,&
&&&& Object data,&
&&&& String textRepresentation) {&
&// TODO Auto-generated method stub&
& if((view instanceof ImageView) && (data instanceof Bitmap)) {&&&
&&ImageView imageView = (ImageView)&&&
&&Bitmap bmp = (Bitmap)&&&
&&imageView.setImageBitmap(bmp);&&&
这样就可以了。
还有一种情况是,我们在非Activity类中读取assets文件下的内容,这个时候就得把调用者(Activity类)的context传递过去,然后在这个非Activity类中使用context.getAssets()方式调用就行了。
举个简单例子:
我们有一个HomeActivity,然后我们它里面调用GetData.initdata(HomeActivity.this).
在GetData类的initdata方法肯定是这样定义的:
复制代码 代码如下:public void initdata(Context context)
//other codes...
&&&&& String[] list_image =
&&&& try {
&&&& //得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用
&&&&&&&&&&&&&&& list_image = context.getAssets().list("processedimages");//attention this line
&&&&&&&&& } catch (IOException e1)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& e1.printStackTrace();
&&&&&&&&&&& }
&&&&& //other codes.....
因为getAssets方法是Context下的方法,在非Activity类中是不能直接使用的。
希望本文所述对大家的Android程序设计有所帮助。
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。22888人阅读
一开始在Android Studio中读取Assets目录下的资源的时候,用的是Eclipse下的getResource().getAssets().open(&xxx.xml&);这里假如是读取一个xml文件,但是这个方法在Android Studio中是会报异常的,为何呢?因为Android Studio和Eclipse中的目录不一样了,所以不能再用Eclipse下的方法读取了,下面是Android Studio中的方法,以我的一个例子来讲
1.首先是assets目录的位置问题,在Eclispe中,这个目录的位置在res/下面,但到了Android Studio中,这个assets目录必须放在跟java和res同级目录下,下面是截图
我这里是放入了8张图片,好了,我现在想把那些图片写到SD卡,就会涉及到怎样读取assets目录下的文件了,其实很简单,首先是声明那些图片,下面是代码:
private String[] names={&songhuiqiao.jpg&,&zhangzetian.jpg&,&songqian.jpg&,&hangxiaozhu.jpg&,&jingtian.jpg&
& & & & & & ,&liuyifei.jpg&,&kangyikun.jpg&,&dengziqi.jpg&};
声明完之后,就可以读取了,是用下面的代码完成的
//获取Assets目录下的文件
& & & & & & & & is=context.getClass().getClassLoader().getResourceAsStream(&assets/&+names[i]);
下面是我的这边的截图:
可以看到用了跟Eclipse中不同的方法就可以读取assets目录下的文件了,下面是打印图片的流的截图:
从打印可以看出,打印出了8张图片的流的信息,由此看出读取assets目录下的图片成功了,接下来就看具体的需要了,这里就不再继续了
总结:Android Studio读取Assets目录下的问题,就是2个问题而已
1.是assets目录的位置问题
2.是读取方法的问题,要用context.getClass().getClassLoader().getResourceAsStream(&assets/&+资源名);
希望能帮助有需要的人
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:24784次
排名:千里之外
(1)(1)(2)(2)(1)查看:8766|回复:2
资深技术经理
最近自己写一个程序,需要把文本文件里面的一些数据在程序第一次启动的时候初始化到数据库中去。所以就涉及到了读取文件的操作。在我们android项目里面,有个assets文件夹,就是用来存储资源文件的,可以通过AssetManager访问。本来以为这是一件三只手指抓田螺--十拿九稳的事情,结果还是花了自己一个小时来调试它,就是读取文件出现了乱码。出现这种东西 &??1??0??0??0??1??&,有些问号在里面。。
二. 解决办法
后来在网上找了些资料看了下,说是要把文本文件保存成UTF-8类型才可以。试了下,果然ok..下面分享下自己这块功能的代码
1. 文本文件内容格式:复制内容到剪贴板代码: 0 9 5 0 1
8 8 6 3 5大概就是这种格式,我需要对它们每行都进行解析,比如第一行解析成 1 0 9 5 0 1 ,也就是8个数字,然后存入数据库里面分别对应的8列
2. 主要代码
这里的话,自己新建了一个MyDbOpenHelper,然后重写了onCreate方法,这个方法会在我们第一次调用db.getReadDatabase()或者getWriteDataBase()方法时调用,而且只会调用一次。就是程序第一次启动的时候。
ok..在onCreate方法里面,主要代码的功能已经注释,大家可以自己看。。private static class MyDbOpenHelper extends SQLiteOpenHelper{
& && &&&private C
& && &&&public MyDbOpenHelper(Context context, String name,
& && && && && & CursorFactory factory, int version) {
& && && && &super(context, name, factory, version);
& && && && &c =
& && &&&public void onCreate(SQLiteDatabase db) {
& && && && &Log.d(&Sandy&, &onCreate database&);
& && && && &//execute when user invoke getReadDatabase/getWriteDatabase
//当用户第一次程序的时候,我们会调用这里,创建我们的表。
& && && && &db.execSQL(&CREATE TABLE & + RAW_DATA_TABLE + & (&
& && && && && && &&&+ RawData._ID + & INTEGER PRIMARY KEY,&
& && && && && && &&&+ RawData.COLUMN_ISSUE + & TEXT,&
& && && && && && &&&+ RawData.COLUMN_NUMBER_ONE + & TEXT,&
& && && && && && &&&+ RawData.COLUMN_NUMBER_TWO + & TEXT , &
& && && && && && &&&+ RawData.COLUMN_NUMBER_THREE + & TEXT,&
& && && && && && &&&+ RawData.COLUMN_NUMBER_FOUR + & TEXT,&
& && && && && && &&&+ RawData.COLUMN_NUMBER_FIVE + & TEXT,&
& && && && && && &&&+ RawData.COLUMN_NUMBER_SIX + & TEXT,&
& && && && && && &&&+ RawData.COLUMN_NUMBER_SEVEN + & TEXT&
& && && && && && &&&+ &);&);
& && && && &
& && && && &ContentValues cv = new ContentValues();
//声明解析文件的文件流对象
& && && && &InputStream in =
& && && && &BufferedReader reader =
& && && && &try {
//通过AssetManager读取文件
& && && && && & in = c.getResources().getAssets().open(&qixingcai-data.txt&, AssetManager.ACCESS_BUFFER);
& && && && && & //构造BufferedReader对象,以便逐行读取
& && && && && & reader = new BufferedReader(new InputStreamReader(in));
& && && && && & S
& && && && && & //逐行读取文件内容,读取一行,就把这一行数据进行拆分,然后保存进数据库
& && && && && & while((line = reader.readLine()) != null){
& && && && && && &&&cv.clear();
& && && && && && &&&//根据分割符&-&和& &进行数据拆分,然后把得到的数据放到ContentValues对象中
& && && && && && &&&String[] issueAndNumber = line.split(&-&);
& && && && && && &&&String[] numbers = issueAndNumber[1].split(& &);
& && && && && && &&&cv.put(RawData.COLUMN_ISSUE, issueAndNumber[0]);
& && && && && && &&&cv.put(RawData.COLUMN_NUMBER_ONE, numbers[0]);
& && && && && && &&&cv.put(RawData.COLUMN_NUMBER_TWO, numbers[1]);
& && && && && && &&&cv.put(RawData.COLUMN_NUMBER_THREE, numbers[2]);
& && && && && && &&&cv.put(RawData.COLUMN_NUMBER_FOUR, numbers[3]);
& && && && && && &&&cv.put(RawData.COLUMN_NUMBER_FIVE, numbers[4]);
& && && && && && &&&cv.put(RawData.COLUMN_NUMBER_SIX, numbers[5]);
& && && && && && &&&cv.put(RawData.COLUMN_NUMBER_SEVEN, numbers[6]);
& && && && && && &&&
& && && && && && &&&//插入数据库
& && && && && && &&&db.insert(RAW_DATA_TABLE, &_id&, cv);
& && && && && && &&&
& && && && && && &&&Log.d(&Sandy&, &issueAndNumber[0]& + issueAndNumber[0]
& && && && && && && &+ &one: & + numbers[0] + & all: & + issueAndNumber[1]);
& && && && && & }
& && && && && &
& && && && && &
& && && && &} catch (IOException e) {
& && && && && & Log.d(&Sandy&, &&, e);
& && && && &}finally{
& && && && && & if (in != null){
& && && && && && &&&try {
& && && && && && && && &in.close();
& && && && && && &&&} catch (IOException e) {
& && && && && && && && &e.printStackTrace();
& && && && && && &&&}
& && && && && & }
& && && && && & if (reader != null){
& && && && && && &&&try {
& && && && && && && && &reader.close();
& && && && && && &&&} catch (IOException e) {
& && && && && && && && &e.printStackTrace();
& && && && && && &&&}
& && && && && & }
& && && && &}
}大概就这么多了,这个功能的话,比较适合有些程序在第一次开机的时候需要初始化一些文本数据到数据库中去,毕竟查找数据库比查文件要方便的多。。
参考链接:
资深技术经理
assets目录和res目录是我们安卓程序存放资源文件的两个目录~~ :D1
资深技术经理
引用:原帖由 zsz 于
16:17 发表
我也同意楼上的说法。 嗯,是的。以前没注意。。:lol1您所在的位置: &
Android读写assets目录下面的资源文件(文件夹)
Android读写assets目录下面的资源文件(文件夹)
本文从原理到实现两方面为大家呈现出了Android如何读写assets目录下面的资源文件(文件夹)。
Android除了提供/res目录存放资源文件外,在/assets目录也会提供存放资源文件,在/assets目录下面不会在R.java里面自动生 成ID,所以读取assets目录下面的资源文件需要提供路径,我们可以通过AssetManager类来访问这些文件。
& & 作者需要实现从
,把所有的资源如:so、apk、可执行文件等放到assets目录下面,apk没有实现逻辑代码)拷贝资源到指定目录下,所以作者创建了一个实现资源拷贝逻辑的
一个Service,也可用Activity实现),由于拷贝路径一般情况下 是不可访问或者创建的(每个apk安装之后只能访问/data/data/自己包名/下面的私有空间),作者需要这个apk能够获取系统权限 (System权限),则必须在AndroidManifest.xml声明shareduserid,具体如何操作下一节进行记录。
一、AssetManager读取文件常用的几个API
1.文件读取方式
AssetManager.open(String
filename),返回的是一个InputSteam类型的字节流,这里的filename必须是文件,而不能是文件夹,AssetManager打开 资源文件的open方法是一个重载方法,可以添加一个打开方式的int参数,根据参数不同可做相应操作。具体请看官方文档
2.资源文件是可以存在文件夹以及子目录
public final&list(&path),返回当前目录下面的所有文件以及子目录的名称。可以通过递归遍历整个文件目录,实现所有资源文件的访问。String[]
Array of strings, one for each asset. These file names are relative to
'path'. You can open the file by concatenating 'path' and a name in the
returned string (via File) and passing that to open().
二、相关实现代码
资源APK(A.apk)
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/files/uploadimg/7210.png" style="cursor:" />
具体实现代码片段,由于使用系统权限,生成的路径可以自己改一下B.apk
public&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&super.onCreate(savedInstanceState);&&&&&&&&setContentView(R.layout.main);&&&&&&&&try&{&&&&&&&&&&&ctxDealFile&=&this.createPackageContext(&com.zlc.ipanel&,&&&&&&&&&&&&&&&&&&&Context.CONTEXT_IGNORE_SECURITY);&&&&&&&&}&catch&(NameNotFoundException&e1)&{&&&&&&&&&&&&&&&&&&&&&&&&e1.printStackTrace();&&&&&&&&}&&&&&&&&btn3.setOnClickListener(new&OnClickListener()&{&&&&&&&&&&&&@Override&&&&&&&&&&&&public&void&onClick(View&v)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&String&uiFileName&=&&ipanelJoin&;&&&&&&&&&&&&&&&&&&&&&deepFile(ctxDealFile,&uiFileName);&&&&&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&&&&&&&&&textView.setText(&file&is&wrong&);&&&&&&&&&&&&&&&}&&&&&&&&&&&&&}&&&&&&&});&&&&&&&&&&}&public&void&deepFile(Context&ctxDealFile,&String&path)&{&&&&&&&&&try&{&&&&&&&&&&&&String&str[]&=&ctxDealFile.getAssets().list(path);&&&&&&&&&&&if&(str.length&&&0)&{&&&&&&&&&&&&&&&&File&file&=&new&File(&/data/&&+&path);&&&&&&&&&&&&&&&file.mkdirs();&&&&&&&&&&&&&&&for&(String&string&:&str)&{&&&&&&&&&&&&&&&&&&path&=&path&+&&/&&+&&&&&&&&&&&&&&&&&&&System.out.println(&zhoulc:\t&&+&path);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&deepFile(ctxDealFile,&path);&&&&&&&&&&&&&&&&&&&&path&=&path.substring(0,&path.lastIndexOf('/'));&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&InputStream&is&=&ctxDealFile.getAssets().open(path);&&&&&&&&&&&&&&&&&FileOutputStream&fos&=&new&FileOutputStream(new&File(&/data/&&&&&&&&&&&&&&&&&&&&&&&&+&path));&&&&&&&&&&&&&&&byte[]&buffer&=&new&byte[1024];&&&&&&&&&&&&&&&int&count&=&0;&&&&&&&&&&&&&&&&&while&(true)&{&&&&&&&&&&&&&&&&&&&count++;&&&&&&&&&&&&&&&&&&&int&len&=&is.read(buffer);&&&&&&&&&&&&&&&&&&&&if&(len&==&-1)&{&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&fos.write(buffer,&0,&len);&&&&&&&&&&&&&&}&&&&&&&&&&&&&&is.close();&&&&&&&&&&&&&&fos.close();&&&&&&&&&&}&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&}&}&
介绍到这大家也应该对Android读写assets目录下面的资源文件有了一定的理解了,希望对大家有所帮助。【编辑推荐】【责任编辑: TEL:(010)】
关于&&的更多文章
作为Android开发者,最头疼是什么?相信大家会异口同声的说Bug!
既然强大的Android Studio来了,有什么理由不去用呢?
App搜索对应用的影响不容忽视,目前应用商店仍采用最
当下,移动App的开发相当火热,Android的和iOS的开发
关于App营销,了解哪类App最能引起用户关注,以及不同
本书是为北大燕工教育研究院编写的计算机网络技术的学习教材。它以实际教学大纲为依据,全面系统的介绍了计算机网络技术知识
Windows Phone专家
Android开发专家
51CTO旗下网站<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&

我要回帖

更多关于 android中assets目录 的文章

 

随机推荐