如何获取Android应用程序包中assets文件夹的路径

22
我有一个完整的文件夹结构,想要从我的assets文件夹中复制。但是,mContext.getAssets().open()似乎只想要一个文件名,以便返回InputStream,这仅适用于复制单个文件。我需要一个来自我的assets文件夹中文件夹的File,以便我可以递归遍历所有文件和文件夹并将它们全部复制。

有人知道如何获取assets文件夹的路径,以便我可以创建一个File对象吗?

编辑:经过一些研究,似乎无法使用绝对路径访问assets/和raw/文件夹中的文件,以便创建File对象。这可能与应用程序包的加密有关。希望有人能证明我是错的!

最后编辑:最终我创建了一个字符串数组来保存额外的资产文件:

   private static final String[] DEFAULT_ALBUM_FILES =
   {INTRO_TO_FLASHUM_DIR+"03 Never Can Say Goodbye.m4a",
    INTRO_TO_FLASHUM_DIR+"11 Bossa Baroque.m4a",
    INTRO_TO_FLASHUM_DIR+"intro fling.3gp"};

然后,我通过使用mContext.getAssets().open()获取InputStream,逐个复制了这些文件。我认为目前不可能使用普通的文件操作遍历资产文件夹。


你尝试过什么?请参见:http://www.wiseandroid.com/post/2010/06/14/Android-Beginners-Intro-to-Resources-and-Assets.aspx - f20k
是的,这正好描述了我所做的。 - charles young
3个回答

5
AssetManager am = con.getAssets();//u have get assets path from this code
InputStream inputStream = null;         
inputStream = am.open("file.xml");

或者

String file_name="ur.xml"    
inputStream = am.open("foldername/"+ur);

2
嗨,有没有办法从InputStream对象中获取文件路径? - SergeyYu
1
@SergeyYu,我也有同样的问题。到目前为止,我还没有能够从流中获取路径。这个问题解决了吗? - NightFuryLxD

4

您能把这个文件夹移动到您的 /raw 文件夹中吗?然后您可以使用以下命令:

 com.your.package:raw/yourFile

像这样:

int resourceId = context.getResources().getIdentifier("com.your.package:raw/somefile.txt");
File f = new File(context.getResources().openRawResource(resourceId));

以下是有关使用assets文件夹的示例:

Android Assets with sub folders

  InputStream is = getAssets().open("subfolder/somefile.txt");

这看起来很有前途。我要试一试。我会回来告诉你结果的。谢谢! - charles young
原始文件夹似乎也不允许绝对路径引用。至少我还没有弄清楚… - charles young
1
问题在于openRawResource()返回一个InputStream,似乎没有办法将后者转换为File。使用您的代码,我得到以下错误:构造函数File(InputStream)未定义。 - charles young
啊,那是因为我简化了这个答案 :-) 一旦你有了IS,你就可以创建你的文件并循环遍历IS将其输入到文件中。这可能不是最好的例子:http://www.roseindia.net/java/java-conversion/InputstreamToFile.shtml 但是它给了你一个提示。 - Blundell
感谢您的帮助。我知道将IS转换为文件的技巧。但是,如何获取与资产文件夹中的文件夹对应的文件?从那里,我希望执行file.listFiles()以获取该文件夹的内容,并迭代其中的内容以复制单个文件。目前,我必须知道该文件夹的内容并逐个复制文件。 - charles young
你好,有没有办法从InputStream对象中获取文件路径? - SergeyYu

-3

使用file:///android_asset来访问资产文件夹,然后您可以在其中始终提供子文件夹。

AssetManager assetManager = null;   // null ???  Get the AssetManager here.
        AssetFileDescriptor assetFileDescriptor = null;
        try{
           assetFileDescriptor = assetManager.openFd("file:///android_asset/yourfolder/file");
                FileDescriptor fd = assetFileDescriptor.getFileDescriptor();
       } catch (Exception e){}

我不太明白如何使用 "file:///android_asset",你能否将其转换为 "File file = new File(...);" 的形式? - charles young
获取AssetManager,获取AssetFileDescriptor,从AssetFileDescriptor获取文件描述符。 - yogsma
9
如何将FileDescriptor转换为File? - charles young
David - 你有得到这个问题的答案吗?如果是,请发布一下。谢谢。 - Kyle Clegg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接