手机如何读取assets隐藏目录

手机如何读取assets隐藏目录,第1张

本文实例讲述了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 >cateList = new ArrayList<Map >()

String[] list_image = null

try {

//得到assets/processedimages/目录下的所有文件的文件名,以便后面打开 *** 作时使用

list_image = context.getAssets().list("processedimages")

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace()

}

for(int i=0i<list_image.length++i)

{

InputStream open = null

try {

String temp = "processedimages/"+list_image[i]

open = context.getAssets().open(temp)

Bitmap bitmap = BitmapFactory.decodeStream(open)

Map map = new HashMap ()

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) view

Bitmap bmp = (Bitmap) data

imageView.setImageBitmap(bmp)

return true

}

return false

}

})

这样就可以了。

还有一种情况是,我们在非Activity类中读取assets文件下的内容,这个时候就得把调用者(Activity类)的context传递过去,然后在这个非Activity类中使用context.getAssets()方式调用就行了。

举个简单例子:

我们有一个HomeActivity,然后我们它里面调用GetData.initdata(HomeActivity.this).

在GetData类的initdata方法肯定是这样定义的:

复制代码 代码如下:public void initdata(Context context)

{

//other codes...

String[] list_image = null

try {

//得到assets/processedimages/目录下的所有文件的文件名,以便后面打开 *** 作时使用

list_image = context.getAssets().list("processedimages")//attention this line

} catch (IOException e1)

{

e1.printStackTrace()

}

//other codes.....

}

因为getAssets方法是Context下的方法,在非Activity类中是不能直接使用的。

希望本文所述对大家的Android程序设计有所帮助。

这个可以在每次应用开启时检测database文件夹下是否有这个名称的数据库,如果没有就从asserts中获得释放一次,给你看一下我的代码:

我的asserts里有一个文件叫做:address.db

/**

*在onCreate()方法中调用

*/

private File initDatabase (){

        BufferedInputStream     bis = null

        BufferedOutputStream    bos = null

        File                    file = getDatabasePath("address.db")

        byte []                 buffer = new byte[1024]

        int                     c

        try {

            if (!file.exists())

                file.getParentFile().mkdirs()

            else

                return file

            bis = new BufferedInputStream(getAssets().open("address.db"))

            bos = new BufferedOutputStream(new FileOutputStream(file))

            while ((c = bis.read(buffer)) != -1)

                bos.write(buffer, 0, c)

        } catch (IOException e) {

            e.printStackTrace()

            return null

        }finally{

            try {

                if (bis != null)

                    bis.close()

                if (bos != null) {

                    bos.close()

                    bos.flush()

                }

            }catch (IOException e){

                e.printStackTrace()

            }

        }

        return file

    }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6672407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存