B4A应用点击保存按钮崩溃,求Manifest存储权限配置方法
问题分析与解决方案
你的代码崩溃核心原因是缺少存储权限的声明与动态申请,以下是具体解决步骤:
1. 编辑Manifest文件添加权限声明
在B4A中通过菜单栏Project > Manifest Editor打开清单文件,添加以下内容:
<!-- 基础存储权限声明 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 10+ 需添加此属性绕过分区存储限制 --> <application android:requestLegacyExternalStorage="true"></application>
注:Android 13+ 虽废弃了WRITE_EXTERNAL_STORAGE,但保留上述声明+legacy属性仍可兼容公共目录写入场景。
2. 修改按钮点击事件,添加动态权限申请
Android 6.0(API 23)及以上系统,必须在运行时主动申请权限,修正后的代码如下:
Private Sub btn_SAVE_Click ' 先申请存储权限 Dim rp As RuntimePermissions rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) Wait For Activity_PermissionResult (Permission As String, Result As Boolean) If Result = False Then ToastMessageShow("需要存储权限才能保存文件", True) Return End If ' 保存逻辑 Const FILENAME As String = "MyTextFile.txt" Const FOLDER_NAME As String = "MyFolder" Dim FolderPath As String FolderPath = File.Combine(File.DirRootExternal,FOLDER_NAME) Dim textToSave As String textToSave = txtbox_TEXT01.Text ' 修正判断逻辑:先检查文件夹是否存在,而非文件 If File.IsDirectory(File.DirRootExternal, FOLDER_NAME) = False Then File.MakeDir(File.DirRootExternal, FOLDER_NAME) End If File.WriteString(FolderPath,FILENAME,textToSave) ToastMessageShow("文件保存成功!", True) End Sub
代码修正点说明:
- 新增权限申请流程,用户拒绝权限时直接终止保存操作
- 修正原判断逻辑:原代码错误判断文件是否存在,改为先检查目标文件夹是否存在
3. 额外优化建议
- 若无需将文件暴露给其他应用,优先使用
File.DirInternal(应用私有存储),无需任何权限,安全性更高 - 避免在公共存储目录创建过多自定义文件夹,尽量使用系统默认目录(如
File.DirDownloads)
内容的提问来源于stack exchange,提问作者PURPLE FACE
相关产品推荐
相关产品推荐

