151

我一直在尝试获取资产文件的 URI 路径。

uri = Uri.fromFile(new File("//assets/mydemo.txt"));

当我检查文件是否存在时,我看到该文件不存在

File f = new File(filepath);
if (f.exists() == true) {
    Log.e(TAG, "Valid :" + filepath);
} else {
    Log.e(TAG, "InValid :" + filepath);
}

有人能告诉我如何提及资产文件夹中存在的文件的绝对路径吗

4

11 回答 11

175

没有“资产文件夹中存在的文件的绝对路径”。项目assets/文件夹的内容打包在 APK 文件中。使用AssetManager对象来获取InputStream资产。

对于WebView,您可以file Uri像使用 URL 一样使用该方案。资产的语法是file:///android_asset/...(注意:三个斜杠),其中省略号是文件assets/夹中文件的路径。

于 2011-01-27T19:31:10.413 回答
78

正确的网址是:

file:///android_asset/RELATIVEPATH

其中 RELATIVEPATH 是相对于资产文件夹的资源路径。

请注意方案中的 3 /。如果没有 3,Web 视图将无法加载我的任何资产。我尝试了 CommonsWare(之前)评论的 2,但它不起作用。然后我在 github 上查看了 CommonsWare 的源代码,并注意到了额外的正斜杠。

这个测试虽然只在 1.6 Android 模拟器上完成,但我怀疑它在真实设备或更高版本上的不同。

编辑:CommonsWare 更新了他的答案以反映这个微小的变化。所以我已经编辑了这个,所以他现在的答案仍然有意义。

于 2011-09-06T19:44:51.823 回答
18

最后,我找到了一种方法来从 Kotlin 的这个答案中获取资产中存在的文件的路径。在这里,我们将资产文件复制到缓存并从该缓存文件中获取文件路径。

@Throws(IOException::class)
    fun getFileFromAssets(context: Context, fileName: String): File = File(context.cacheDir, fileName)
            .also {
               if (!it.exists()) {
                it.outputStream().use { cache ->
                    context.assets.open(fileName).use { inputStream ->
                            inputStream.copyTo(cache)
                    }
                  }
                }
            }

获取文件的路径,如:

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath
于 2019-06-05T07:29:53.740 回答
14

请尝试此代码工作正常

 Uri imageUri = Uri.fromFile(new File("//android_asset/luc.jpeg"));

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();
于 2017-01-04T07:12:26.767 回答
7

在此处输入图像描述

确保您的资产文件夹放置在正确的位置。

于 2016-05-31T12:22:39.460 回答
6

适用于 WebView 但似乎在URL.openStream(). 因此,您需要区分 file:// 协议并按照建议通过 AssetManager 处理它们。

于 2011-09-03T17:14:48.373 回答
3
InputStream is = getResources().getAssets().open("terms.txt");
String textfile = convertStreamToString(is);
    
public static String convertStreamToString(InputStream is)
        throws IOException {

    Writer writer = new StringWriter();
    char[] buffer = new char[2048];

    try {
        Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        int n;
        while ((n = reader.read(buffer)) != -1) {
            writer.write(buffer, 0, n);
        }
    } finally {
        is.close();
    }

    String text = writer.toString();
    return text;
}
于 2012-03-03T07:07:16.220 回答
3

试试这个,它有效:

InputStream in_s = 
    getClass().getClassLoader().getResourceAsStream("TopBrands.xml");

如果你得到一个空值异常,试试这个(使用 class TopBrandData):

InputStream in_s1 =
    TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");
于 2014-07-02T07:37:07.333 回答
1

试试这个 :

Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.cat); 

我已经做到了,而且奏效了

于 2014-02-21T01:42:18.990 回答
0

是的,你不能从你的安卓手机或模拟器访问你的驱动器文件夹,因为你的电脑和安卓是两个不同的操作系统。我会去安卓的 res 文件夹,因为它有很好的资源管理方法。除非您有充分的理由将文件放在资产文件夹中。相反,您可以这样做

try {
      Resources res = getResources();
      InputStream in_s = res.openRawResource(R.raw.yourfile);

      byte[] b = new byte[in_s.available()];
      in_s.read(b);
      String str = new String(b);
    } catch (Exception e) {
      Log.e(LOG_TAG, "File Reading Error", e);
 }
于 2015-06-27T05:34:10.017 回答
-8

为我工作试试这个代码

   uri = Uri.fromFile(new File("//assets/testdemo.txt"));
   String testfilepath = uri.getPath();
    File f = new File(testfilepath);
    if (f.exists() == true) {
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
    } else {
   Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
 }
于 2015-08-20T14:07:08.917 回答