首页 > 解决方案 > 如何从 WebView 的 HTML 页面访问外部存储?

问题描述

我正在编写一个带有 WebView 前端的应用程序。我想让用户拍照,然后将它们嵌入到 HTML 中。

到目前为止,我设法实现了拍照并将它们存储在外部存储中,但我不知道如何从 HTML 访问它们,例如通过<img/>标签。

我已经做过的步骤:

  1. 创建了一个外部存储的文件:

    private fun createImageFile(): File {
        val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        val file = File(storageDir, "pic.jpg")
        file.createNewFile()
        return file
    }
    
  2. 在清单中添加了必要的权限声明:

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
  3. 由于这些是危险的权限,我确保它们在运行时被授予(省略代码,因为我已经仔细检查过它是否有效)。

  4. @JavascriptInterface通过向我的 HTML 页面公开文件 uri :

     @JavascriptInterface
     fun getSelfiePath() : String {
          return file.toURI().toString()
     }
    
  5. 我从我的<img/>标签中引用了 uri:

     function populatePicture() {
         let picDiv = document.getElementById("pic")
         picDiv.innerHTML = '<img src="' + controller.getPicturePath() + '" />'
         // getPicturePath() returns path in the format of: 
         // /storage/emulated/0/Android/data/{package}/files/Pictures/pic.jpg
     }
    

我意识到所有这些都不是你所说的最小工作示例,但我发现很难提供一个,因为问题跨越了许多“领域”。

我用 URI 尝试了许多不同的方法,例如在它前面加上file:///,但是没有一个奏效。更让我困惑的是,我不能以这种方式轻松访问编译时资源,但对于放置在外部存储中的资源,它根本不起作用。

什么是正确的方法?我觉得我在以下方面遗漏了一些东西:

  1. 从 HTML 访问外部存储。

或者

  1. 正确使用方法来生成 URI 字符串。

标签: androidandroid-studiowebviewandroid-sdcardandroid-external-storage

解决方案


推荐阅读