在storage文件夹下创建文件可能需要动态申请权限

在相应Activity.java里添加以下代码,这里以 WRITE_EXTERNAL_STORAGE 为例

public void requestPower() {
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
        if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            //第一次上面这个方法返回的是false,之后就一直返回true
        }else{
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);//核心
            //此处会弹出一个框框询问你是否给予权限
       }
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if(requestCode==1){
        for(int i=0;i<permissions.length;i++){//可能有多个权限,需要观测是否为PERMISSION_GRANTED状态
            if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
                Toast.makeText(this, "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this, "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
弹出的询问框无论选择 是 还是 否,之后都不再会询问,因为ActivityCompat.shouldShowRequestPermissionRationale会返回true。

//显然这块代码的核心是ActivityCompat.requestPermissions(Context context, String[] permissions, int requestCode);这个方法


通过Environment.getExternalStorageDirectory().getAbsolutePath()拿到sd卡路径 filePath(String) 后 ,通过File file = new File(filePath + "/xxx");来创建之前,加上 requestPower();

当然,既然是动态申请,在Manifest文件里也要记得添加好要动态申请的这个权限。


总结

1.判读是否获得权限

if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
    //还没获得这个权限
}


2.申请权限(这个方法被调用时就会出现一个框框)

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);


3.权限申请的回调方法

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if(requestCode==1){
        for(int i=0;i<permissions.length;i++){//可能有多个权限,需要观测是否为PERMISSION_GRANTED状态
            if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
                Toast.makeText(this, "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this, "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();
            }
        }
    }
}




顺便随便说说我遇到的一个问题:

由于app在sd目录下已经创建了一个一个xxx文件夹,卸载这个应用后此文件依然会存在

再安装测试,此时在弹出权限选择框之前app发生崩溃

报错行代码为:

FileOutputStream fos = new FileOutputStream(path);

分析发现报错原因并不是path不存在,而正是因为存在才引起的问题

原因是弹出权限框时,此时说明还没有得到写入权限,但由于有了以前创建的那个xxx文件夹,之后的代码便以已经有权限的状态去尝试写入修改,当然会崩溃了。(我的处理方式是 若没有xxx文件夹时会创建,若失败(说明还没有权限)会返回false,之后跳出不再执行之后的代码,若已有xxx文件,则直接执行之后的代码)

总的来说,因为有了xxx文件,让其误以为已经有写入权限,毕竟有了xxx文件夹并不代表可以再创建文件,因为xxx文件可能是之前被卸载的app所留下的东西,而此时并没有写入的权限

解决只要在之后的代码前加上一个简单的 if 判断即可




在Uniapp中创建文件夹,可以通过使用原生的JavaScript代码来实现。首先,你需要确保你的应用已经获取了读取和写入存储权限。你可以在你的项目的manifest.json文件中添加以下代码来申请权限: ```json "android": { "permission": [ { "name": "android.permission.READ_EXTERNAL_STORAGE", "reason": "We need this permission to read files from storage" }, { "name": "android.permission.WRITE_EXTERNAL_STORAGE", "reason": "We need this permission to write files to storage" } ] } ``` 然后,你可以使用以下JavaScript代码来创建文件夹: ```javascript // 获取文件系统管理器 const fs = uni.getFileSystemManager(); // 定义要创建的文件夹路径 const folderPath = `${uni.env.USER_DATA_PATH}/myFolder`; // 创建文件夹 fs.mkdir({ dirPath: folderPath, recursive: true, // 如果父文件夹不存在,是否创建父文件夹,默认为false success(res) { console.log('文件夹创建成功'); }, fail(err) { console.log('文件夹创建失败', err); } }); ``` 以上代码中,我们首先通过`uni.getFileSystemManager()`获取文件系统管理器。然后,我们定义了要创建的文件夹路径,这里使用了`uni.env.USER_DATA_PATH`来获取应用的用户数据目录。最后,我们使用`fs.mkdir()`方法来创建文件夹,其中`recursive`选项设置为`true`表示如果父文件夹不存在,会自动创建父文件夹。 请注意,以上代码只适用于Android平台。在iOS平台上,由于沙盒限制,无法直接在应用的主目录下创建文件夹。在iOS平台上,你可以尝试使用第三方插件或者使用原生的Objective-C或Swift代码来实现文件夹的创建。<span class="em">1</span> #### 引用[.reference_title] - *1* [uniapp安卓读取或写入txt文件,创建文件文件夹,获取手机内置存储根路径](https://blog.csdn.net/fentashen9162/article/details/131141071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值