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

Tit*_*tus 114 android uri assets filepath

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

uri = Uri.fromFile(new File("//assets/mydemo.txt"));
Run Code Online (Sandbox Code Playgroud)

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

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

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

Com*_*are 152

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

编辑

要修复下面的一条评论,资产的URL语法是WebView(注意:三个斜杠).

  • `file:// android_asset/...`,其中`...`是项目`assets /`目录中的相对路径. (29认同)
  • @CommonsWare看起来你错过了URI中的'/'.它应该是`file:///`. (20认同)
  • 我试过这个`new file("file:///android_asset/sounds/beep.mid");`,但结果文件不存在.有任何想法吗?PS文件位于`assets/sounds /`文件夹中. (5认同)
  • 这是一个使用`file:// android_asset /`的示例项目,但不适用于`Uri`:https://github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1 (4认同)
  • 'file:///android_asset /...'是否适用于WebView,并且无法在WebView外使用URI/URL/Uri获取InputStream? (3认同)

Rus*_*uss 70

正确的网址是:

file:///android_asset/RELATIVEPATH
Run Code Online (Sandbox Code Playgroud)

其中RELATIVEPATH是资源相对于assets文件夹的路径.

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

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

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

  • 不再工作 `String fileName = "file:///android_asset/file.csv";` `System.out.println(new File(fileName).exists()); // 打印 false` (4认同)

Shy*_*dda 16

最后,我找到了一种方法来从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)
                    }
                  }
                }
            }
Run Code Online (Sandbox Code Playgroud)

获取文件的路径,如:

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath
Run Code Online (Sandbox Code Playgroud)

  • 对于某人来说,如果文件名之前有一些目录,例如 -> ("raw/filename.ext" ),在 it.outputStream().use { cache -> .. 之前的 if (!it.exists()) 块内. 添加此代码以创建目录(如果不存在) --> val fileDir = File( context.cacheDir, File.separator.toString() + "raw" ) fileDir.mkdir() (2认同)

Chu*_*.gu 8

在此输入图像描述

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

  • 您可以将其放在任何您想要的位置,并在 build.gradle 文件中定义路径,如下所示 `sourceSets { main { assets.srcDirs = ['src/main/assets'] } }` (2认同)
  • 如何获取 hello.html 的路径?请加 (2认同)

小智 8

请尝试此代码正常工作

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

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();
Run Code Online (Sandbox Code Playgroud)


小智 6

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