uni-app 云打包 targetSdkVersion=29或30 时,鸿蒙系统 webview调用远端页面上传图片弹出net::ERR_ACCESS_DENIED

uni-app 云打包 targetSdkVersion=29或30 时,鸿蒙系统 webview调用远端页面上传图片弹出net::ERR_ACCESS_DENIED

操作步骤:

  • 选择手机图库文件,然后点击上传按钮

预期结果:

  • 上传按钮页面回调调用后台cs代码

实际结果:

  • 鸿蒙系统HarmonyOS测试:

    • 使用真机调试直接调试,上面的上传功能正常
    • 使用云打包targetSdkVersion=28时安装,上面的上传功能正常
    • 使用云打包targetSdkVersion=29或者30时安装,点击上传按钮会弹出网页无法打开 位于 **的页面无法加载,因为:net::ERR_ACCESS_DENIED
  • 主要表现在sdk 28时选择图库文件或者相机会先询问权限是否允许访问设备上的照片、媒体内容和文件

  • sdk 29 30 时没有询问权限

bug描述:

  • 测试手机 华为手机P20 Pro ,nova 都是 鸿蒙系统HarmonyOS
  • H5+ APP WebView调用远程Apsx页面(一个上传文件的页面)
<%@ Page Language="C#" AutoEventWireup="true"  EnableViewState="false" CodeBehind="fileupload.aspx.cs" Inherits="fileupload" %>

<!DOCTYPE html>  

<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <meta charset="utf-8">  
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
    <meta name="apple-mobile-web-app-capable" content="yes">  
    <meta name="apple-mobile-web-app-status-bar-style" content="black">  
    <title></title>  
    <link href="../MUI/css/mui.min.css" rel="stylesheet" />  
    <link href="../Content/css/app.css" rel="stylesheet" />  
</head>  
<body>  
    <form id="form1" runat="server">  
        <div>  
            <asp:FileUpload ID="FileUpload1" runat="server" /><br />  
            <br />  
           <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上传" />       
        </div>  
    </form>  
</body>  
</html>
  • Android系统10,11测试:

    • 上面的上传功能正常
  • 鸿蒙系统HarmonyOS测试:

    • 使用真机调试直接调试,上面的上传功能正常
    • 使用云打包targetSdkVersion=28时安装,上面的上传功能正常
    • 使用云打包targetSdkVersion=29或者30时安装,点击上传按钮会弹出网页无法打开 位于 **的页面无法加载,因为:net::ERR_ACCESS_DENIED

图片

Image 1 Image 2


更多关于uni-app 云打包 targetSdkVersion=29或30 时,鸿蒙系统 webview调用远端页面上传图片弹出net::ERR_ACCESS_DENIED的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

问题已记录,等待验证

更多关于uni-app 云打包 targetSdkVersion=29或30 时,鸿蒙系统 webview调用远端页面上传图片弹出net::ERR_ACCESS_DENIED的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这是Android 10(API 29)引入的存储权限策略变更(Scoped Storage)导致的兼容性问题。当targetSdkVersion≥29时,应用默认启用分区存储,WebView访问文件需要特殊处理。

解决方案:

  1. 临时方案:在manifest.json中配置targetSdkVersion为28,但这不是长久之计,Google Play要求2023年8月起targetSdkVersion必须≥33。

  2. 推荐方案:在manifest.jsonapp-plus->distribute->android节点下添加以下配置:

{
  "permissions": [
    "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" android:maxSdkVersion=\"28\" />",
    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" android:maxSdkVersion=\"28\" />"
  ],
  "android": {
    "permissionExternalStorage": {
      "request": "none"
    }
  }
}
  1. WebView适配:对于远程页面中的文件上传,需要修改WebView的配置。在页面初始化时添加:
// 在uni-app的页面中
onLoad() {
  // #ifdef APP-PLUS
  const currentWebview = this.$scope.$getAppWebview();
  const webview = currentWebview.children()[0];
  webview.setStyle({
    fileAccess: true
  });
  // #endif
}
  1. 鸿蒙系统特别处理:在src/main/AndroidManifest.xml中添加(如存在):
<application
  android:requestLegacyExternalStorage="true"
  android:usesCleartextTraffic="true">
  1. 检查网络配置:确保manifest.json中已允许HTTP请求:
{
  "app-plus": {
    "security": {
      "network": {
        "cleartextTraffic": true
      }
    }
  }
}
回到顶部