如何从资产文件中获取URI?

时间:2011-01-27 19:22:46

标签: android uri filepath assets

我一直在尝试获取资产文件的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);
}

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

11 个答案:

答案 0 :(得分:138)

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

修改

要修复下面的一条评论,资产的网址语法为file:///android_asset/...(注意:三个斜杠)。

答案 1 :(得分:68)

正确的网址是:

file:///android_asset/RELATIVEPATH

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

注意计划中的3 /。如果没有3,Web视图将不会加载我的任何资产。我尝试过2,因为(之前)CommonsWare评论它不会工作。然后我在github上查看了CommonsWare的源码并发现了额外的正斜杠。

此测试仅在1.6 Android模拟器上进行,但我怀疑它在真实设备或更高版本上有所不同。

编辑:CommonsWare更新了他的答案以反映这一微小变化。所以我编辑了这个,所以它目前的答案仍然有意义。

答案 2 :(得分:8)

enter image description here

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

答案 3 :(得分:6)

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

答案 4 :(得分:6)

请尝试此代码正常运行

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

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();

答案 5 :(得分: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;

答案 6 :(得分:3)

试试这个:它有效

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

如果你有空值异常,试试这个:

InputStream in_s1 =   TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");

TopBranData是一个类

答案 7 :(得分:1)

试试这个:

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

我做过它并且有效

答案 8 :(得分:0)

是的,你无法从你的Android手机或模拟器访问你的驱动器文件夹,因为你的计算机和android是两个不同的操作系统。我会去android的res文件夹,因为它有很好的资源管理方法。除非你有充分的理由把你的文件放在assets文件夹中。相反,你可以这样做

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);
 }

答案 9 :(得分:0)

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

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

获取文件的路径,例如:

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath

答案 10 :(得分:-5)

为我工作尝试此代码

   uri = Uri.fromFile(new File("//assets/testdemo.txt"));
    File f = new File(testfilepath);
    if (f.exists() == true) {
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
    } else {
   Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
 }