h5+app Android上架华为应用市场被拒原因“拒绝获取手机权限后app会闪退“以及隐私政策问题

本文详细阐述了如何在Android应用上传华为应用市场时,遇到因请求手机权限后闪退的问题,通过修改manifest.json中的权限设置并附上隐私政策解决方案,帮助开发者解决上架难题。

h5+app Android上架华为应用市场被拒原因"拒绝获取手机权限后app会闪退"

华为应用市场报错:拒绝获取手机权限后app会闪退,此问题解决方案如下:

在manifest.json文件里的"distribute"节点下的"google"节点下增加"permissionExternalStorage",代码如下:

  "google" : {
                "packagename" : "", /*Android应用包名,如io.dcloud.HelloH5*/
                "keystore" : "", /*Android应用打包使用的密钥库文件*/
                "password" : "", /*Android应用打包使用密钥库中证书的密码*/
                "aliasname" : "", /*Android应用打包使用密钥库中证书的别名*/

                // "custompermissions" : true,
                "permissions" : [ ],
                "permissionExternalStorage" : {
                    "request" : "once",
                    "prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
                },
                "autoSdkPermissions" : false
            },

注意:最关键的是request属性是once,request有三个属性,我试的其他方法都不行。

隐私政策和服务协议是app上架必须要有的,具体如下:

 "plus" : {
        "privacy" : {
            "prompt" : "template",
            "template" : {
                "title" : "服务协议和隐私政策",
                "message" : "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href='隐私政策地址'>《服务协议》</a>和<a href='服务协议地址'>《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
                "buttonAccept" : "我知道了",
                "buttonRefuse" : "暂不同意"
            }
        },
    }

由于本人也是第一次开发h5+app,虽然总结起来很简单,但是也爬了好一阵子,总会有各种问题,以上问题是自己的记录,也希望能帮助遇到类似问题的伙伴,不足的地方还望大神指教!

<think>我们已经在之前的讨论中详细介绍了H5+ App中使用IO模块保存文件的方法。现在,用户要求提供一个完整的实现代码,包括点击按钮生成JSON或TXT文件并保存到Android手机本地。根据用户需求,我们将创建一个简单的HTML页面,其中包含一个按钮,点击该按钮将触发保存文件的操作。我们将使用之前封装的`saveLocalFile`函数,并针对用户的具体需求进行调整。注意:用户提到了华为应用市场问题,涉及权限申请。因此,我们在代码中会注意权限请求的时机,并按照华为的要求在manifest.json中配置权限申请提示。完整代码实现如下:1. HTML部分:创建一个按钮2. JavaScript部分:-封装保存文件的函数-按钮点击事件绑定-处理权限问题H5+引擎在Android6以上需要动态申请权限,但IO模块在PUBLIC_DOCUMENTS目录下操作时,H5+框架会自动处理权限,但为了符合华为的要求,我们需要在manifest.json中配置权限申请描述)由于H5+的IO模块在写入文件时,如果应用没有存储权限,会触发系统的权限申请对话框。但是,根据引用[1]的内容,华为应用市场要求应用在拒绝权限后不能闪退,并且需要提供清晰的权限申请说明。因此,我们在manifest.json中需要配置`permissionExternalStorage`,并设置合理的提示语。我们先给出前端页面和JS代码,然后给出manifest.json中关于权限的配置部分。前端代码(index.html):</think>### H5+ App 使用 IO 模块在 Android 设备上保存文件的完整实现 以下是完整的实现代码,包含按钮点击事件、文件生成、权限处理和错误处理: #### HTML 部分 (index.html) ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>文件生成示例</title> <script src="js/mui.min.js"></script> <style> .container { padding: 20px; text-align: center; } button { padding: 15px 30px; font-size: 18px; margin: 20px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; } #status { margin-top: 20px; color: #666; } </style> </head> <body> <div class="container"> <h1>文件生成示例</h1> <button id="generateJson">生成JSON文件</button> <button id="generateTxt">生成TXT文件</button> <div id="status">准备就绪</div> </div> <script> // 等待plus初始化完成 document.addEventListener('plusready', function() { // 绑定按钮事件 document.getElementById('generateJson').addEventListener('click', function() { generateFile('data.json', JSON.stringify({ timestamp: new Date().toISOString(), device: plus.device.model, os: plus.os.name, data: { value: Math.random() * 100 } }), 'JSON'); }); document.getElementById('generateTxt').addEventListener('click', function() { generateFile('log.txt', `日志记录\n时间: ${new Date().toLocaleString()}\n设备: ${plus.device.model}\n随机值: ${Math.random()}\n`, 'TXT'); }); }); </script> </body> </html> ``` #### JavaScript 核心功能 (js/file-util.js) ```javascript // 文件保存功能 function generateFile(fileName, content, fileType) { updateStatus(`正在生成${fileType}文件...`); // 获取文件系统 plus.io.requestFileSystem(plus.io.PRIVATE_DOCUMENTS, function(fs) { // 创建/获取文件 fs.root.getFile(fileName, { create: true }, function(fileEntry) { // 创建写入器 fileEntry.createWriter(function(writer) { writer.onwrite = function() { // 获取文件路径 const filePath = plus.io.convertLocalFileSystemURL(fileEntry.toURL()); updateStatus(`${fileType}文件已保存!\n路径: ${filePath}`); }; writer.onerror = function(e) { updateStatus(`写入失败: ${e.message}`, true); }; // 写入内容 writer.seek(0); writer.truncate(0); // 清空文件 writer.write(content); }, function(e) { updateStatus(`创建写入器失败: ${e.message}`, true); }); }, function(e) { updateStatus(`创建文件失败: ${e.message}`, true); }); }, function(e) { // 处理权限问题 if (e.code === 12) { // 权限拒绝错误码 updateStatus("需要存储权限才能保存文件", true); requestStoragePermission(); } else { updateStatus(`文件系统错误: ${e.message}`, true); } }); } // 更新状态显示 function updateStatus(message, isError = false) { const statusEl = document.getElementById('status'); statusEl.textContent = message; statusEl.style.color = isError ? 'red' : '#666'; } // 请求存储权限 function requestStoragePermission() { plus.android.requestPermissions(['android.permission.WRITE_EXTERNAL_STORAGE'], function(e) { if (e.deniedAlways.length > 0) { updateStatus("您已永久拒绝存储权限,请在设置中启用", true); } else if (e.denied.length > 0) { updateStatus("存储权限拒绝,无法保存文件", true); } else { updateStatus("存储权限已授予,请重试操作"); } }, function(e) { updateStatus("权限请求失败: " + e.message, true); } ); } ``` #### manifest.json 权限配置 ```json { "name": "FileDemo", "id": "com.example.filedemo", "version": "1.0.0", "permissions": { "File": { "description": "文件存储权限" } }, "distribute": { "android": { "permissions": [ "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>" ], "permissionExternalStorage": { "request": "once", "prompt": "应用需要存储权限来保存生成的文件到您的设备" } } } } ``` ### 关键功能说明 1. **文件生成流程**: ```mermaid graph TD A[用户点击按钮] --> B[创建文件内容] B --> C[请求文件系统] C --> D{权限检查} D -->|有权限| E[创建文件] D -->|无权限| F[请求权限] E --> G[写入内容] G --> H[显示保存路径] ``` 2. **存储位置**: - `PRIVATE_DOCUMENTS`:应用私有目录(推荐) - `PUBLIC_DOCUMENTS`:公共文档目录(需要额外权限) 3. **权限处理**: - 自动检测权限状态 - 友好的权限请求提示 - 处理用户拒绝权限的场景 4. **文件路径获取**: ```javascript // 转换文件路径为系统路径 const filePath = plus.io.convertLocalFileSystemURL(fileEntry.toURL()); // 输出示例: /storage/emulated/0/Android/data/com.example.filedemo/files/data.json ``` ### 注意事项 1. **Android 11+ 适配**: ```json // 在manifest.json中添加 "distribute": { "android": { "targetSdkVersion": 30, "android:requestLegacyExternalStorage": true } } ``` 2. **错误处理**: - 文件系统错误 - 权限拒绝 - 写入失败 - 设备存储空间不足 3. **文件内容优化**: - JSON 文件使用 `JSON.stringify(data, null, 2)` 可生成格式化内容 - 大型文件使用分块写入 4. **华为应用市场要求**: - 在权限请求中提供明确说明 - 处理权限拒绝后不闪退 - 隐私政策中说明文件存储用途 [^1]: 华为应用市场上架权限配置要求
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值