安卓App内嵌vue项目

在安卓App内嵌vue项目中,vue中使用了plus.gallery.pick,然后返回的是contenturi内容,然后使用了plus.io.resolveLocalFileSystemURL显示地址无效,现在无法上传图片给后端,如何在vue项目中进行修改

参考GPT和自己的思路:在安卓App内嵌Vue项目中使用plus.gallery.pick获取到的是contenturi,而plus.io.resolveLocalFileSystemURL无法解析contenturi,这是因为contenturi不是一个本地的文件路径,而是一个指向Android系统中MediaStore的一个资源地址。

为了解决这个问题,可以使用cordova-plugin-filepath插件来处理contenturi,该插件可以将contenturi转换为本地文件路径。以下是安装和使用cordova-plugin-filepath插件的步骤:

安装cordova-plugin-filepath插件

cordova plugin add cordova-plugin-filepath


在Vue项目中使用该插件

// 引入 cordova-plugin-filepath 插件
import FilePath from 'cordova-plugin-filepath';

// 使用 FilePath.resolveNativePath 方法将 content uri 转换为本地文件路径
FilePath.resolveNativePath(uri, (filePath) => {
  console.log('本地文件路径:', filePath);
});


使用以上方法可以将contenturi转换为本地文件路径,然后就可以将本地文件路径上传给后端了。

参考GPT和自己的思路,针对你提到的问题,可以尝试以下步骤来解决:

1.获取 content uri 对应的实际文件路径。
在 Android 平台上,content uri 可能需要使用 ContentResolver.query 方法查询获取对应的实际文件路径。可以通过如下代码来实现:

const filePath = new Promise(resolve => {
  const contentResolver = plus.android.runtimeMainActivity().getContentResolver()
  const cursor = contentResolver.query(contentUri, null, null, null, null)
  cursor.moveToFirst()
  const columnIndex = cursor.getColumnIndex("_data")
  const path = cursor.getString(columnIndex)
  cursor.close()
  resolve(path)
})

2.使用获取到的实际文件路径进行文件上传。
在获取到实际文件路径后,可以使用类似 Axios 这样的库进行文件上传,例如:

const formData = new FormData()
const file = new File([new Blob([await fetch(filePath).then(res => res.blob())])], 'filename.png')
formData.append('file', file)
axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } })
  .then(response => {
    // 处理上传成功的逻辑
  })
  .catch(error => {
    // 处理上传失败的逻辑
  })

注意,在 Android 平台上,由于涉及到文件读写权限,可能需要在 AndroidManifest.xml 文件中添加对应的权限声明,例如:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

希望以上步骤对你有所帮助。

针对你的问题,我建议你可以在plus.io.resolveLocalFileSystemURL中使用文件的真实路径而不是URI类型的内容,这样就能够正确地访问到文件了。你可以通过调用Android平台相关API或使用cordova-plugin-filepath插件获取文件的真实路径。

具体来说,你可以按照以下步骤进行修改:

在Vue项目中安装cordova-plugin-filepath插件,具体可以参考插件官方文档。

调用plus.gallery.pick函数选择图片,并获取到URI类型的数据。

使用cordova-plugin-filepath插件的相关API,将URI类型的数据转换成真实路径。

将真实路径传递给plus.io.resolveLocalFileSystemURL函数,进行文件操作。

以下是一个示例代码片段,供你参考:

// 调用plus.gallery.pick函数选择图片
plus.gallery.pick(function(e) {
  // 获取URI类型的数据
  var uri = e.files[0];
  
  // 使用cordova-plugin-filepath插件将URI类型的数据转换成真实路径
  window.FilePath.resolveNativePath(uri, function(filePath) {
    // 将真实路径传递给plus.io.resolveLocalFileSystemURL函数
    plus.io.resolveLocalFileSystemURL(filePath, function(entry) {
      // entry就是文件操作对象,可以进行上传操作等等
    });
  }, function(error) {
    // 处理错误信息
  });
}, function(error) {
  // 处理错误信息
}, {filter: 'image'});


function galleryImg() {
    plus.gallery.pick(function(a) {
        plus.io.resolveLocalFileSystemURL(a, function(entry) {
            plus.io.resolveLocalFileSystemURL("_doc/", function(root) {
                root.getFile("head.jpg", {}, function(file) {
                    //文件已存在
                    file.remove(function() {
                        //console.log("file remove success");
                        entry.copyTo(root, 'head.jpg', function(e) {
                                var e = e.fullPath + "?version=" + new Date().getTime();
                                xianshivideo(); //显示视频
                                document.getElementById("head-img1").src = e;
                                //变更大图预览的src
                                //目前仅有一张图片,暂时如此处理,后续需要通过标准组件实现
                                document.querySelector("#__mui-imageview__group .mui-slider-item img").src = e + "?version=" + new Date().getTime();
                            },
                            function(e) {
                                console.log('copy image fail:' + e.message);
                            });
                    }, function() {
                        console.log("delete image fail:" + e.message);
                    });
                }, function() {
                    //文件不存在
                    entry.copyTo(root, 'head.jpg', function(e) {
                            var path = e.fullPath + "?version=" + new Date().getTime();
                            xianshivideo(); //显示视频
                            document.getElementById("head-img1").src = path;
                            //变更大图预览的src
                            //目前仅有一张图片,暂时如此处理,后续需要通过标准组件实现
                            document.querySelector("#__mui-imageview__group .mui-slider-item img").src = path;
                        },
                        function(e) {
                            console.log('copy image fail:' + e.message);
                        });
                });
            }, function(e) {
                console.log("get _www folder fail");
            })
        }, function(e) {
            console.log("读取拍照文件错误:" + e.message);
        });
    }, function(a) {}, {
        filter: "image" // **_这个类型对吗_**
    })
};

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
问题分析:

根据你的问题描述,你在安卓App内嵌的vue项目中,使用了plus.gallery.pick,从相册中选择图片后返回contenturi内容,但是使用了plus.io.resolveLocalFileSystemURL方法无法显示地址,导致无法上传图片给后端。原因可能是因为获取的contenturi是Android特有的Uri格式,需要进行转换。

解决办法:

可以尝试使用cordova-plugin-file插件来进行获取本地文件路径的操作。

步骤:

  1. 安装cordova-plugin-file插件。
cordova plugin add cordova-plugin-file
  1. 使用Plus.gallery.pick方法选择图片后,获取到contenturi后,调用resolveLocalFileSystemURL方法获取本地文件路径。
plus.gallery.pick(function(path) {
    plus.io.resolveLocalFileSystemURL(path, function(entry) {
        var localPath = entry.toLocalURL();
        // 上传图片给后端
        uploadImage(localPath);
    });
});
  1. 上传图片给后端的方法可以使用你们项目中的上传方法。

示例代码:

```
var uploadImage = function(localPath) {
// 调用上传图片接口,上传图片给后端
// 示例代码
var serverUrl = "http://x/

在将Vue项目嵌入Android App中,您可以使用WebView来加载Vue的index.html文件。下面是一个基本的步骤:

  1. 生成Vue项目并构建

使用Vue-CLI创建一个Vue项目,并使用npm run build命令进行构建。

  1. 将构建后的文件复制到Android应用程序中

将构建后的dist文件夹中的所有内容复制到Android应用程序的资源目录中。

  1. 在Android应用程序中创建一个WebView

在Android应用程序中使用WebView控件来加载Vue的index.html文件,可以使用以下步骤来创建WebView:

(1)通过XML文件添加一个WebView控件

(2)在Java代码中获取WebView并加载URL

WebView webView = (WebView) findViewById(R.id.webview);
webView.loadUrl("file:///android_asset/dist/index.html");

这里的loadUrl()方法指定设置WebView打开的URL是加载本地的index.html文件。

  1. 允许WebView执行JavaScript代码

默认情况下,WebView不允许执行JavaScript代码。可以通过以下方式启用它:

webView.getSettings().setJavaScriptEnabled(true);

  1. 处理WebView中的错误

要处理运行过程中在WebView中可能出现的错误,可以注册一个WebViewClient并重写必要的方法来处理错误。

由于Android允许应用程序访问Internet,因此Vue应用程序中发送的HTTP请求也可以在Android应用程序中正常工作。

以上是将Vue项目内嵌到Android应用程序中的基本步骤,您可以根据实际需要做更多的修改和优化。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

地址无效,说明你的地址不是服务器的地址,而是本地文件开头的,需要http开头的那个地址