​本文已参加「新人创作礼」活动,一同开启创作之路。

谨以此篇来记录往Android内存中写txt文件踩过的坑.

一 请求权限

当你无法将txt文件写不进去的时分,大部分人会说你没有动态请求权限啊啥啥的,而且网上动态请求权限的办法每个人写的不尽相同,大部分的做法是请求权限,然后去check下是否请求了,授权了咋办,回绝了咋办……..

但有的时分,你写不进去他不必定是由于你没有动态请求权限啊,然后你就按那个人的弄弄,仿制下那个人的…..陷入下面的循环中…….

while(写不进去){
    仿制
    注释
}//死循环

Android11 往手机里中写txt文件

必定要对自己的请求权限的代码有信息,写不进去有或许不是由于我的权限请求有问题,只要app赋予了下面俩权限,就要考虑是不是不是权限的问题

Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE

前面说了,动态请求权限网上的办法不尽相同,直到遇到郭大神的 permissionx

怎么运用 permissionx

这有一链接permissionx的仓库地址

然后将内容仿制待build.gradle中的依靠中,如图所示:

Android11 往手机里中写txt文件
Android11 往手机里中写txt文件

然后在MainActivity.java中添加请求权限的代码(这便是郭神的代码):

 PermissionX.init(this)
                .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)
                .onExplainRequestReason(new ExplainReasonCallbackWithBeforeParam() {
                    @Override
                    public void onExplainReason(ExplainScope scope, List<String> deniedList, boolean beforeRequest) {
                        scope.showRequestReasonDialog(deniedList, "即将请求的权限是程序有必要依靠的权限", "我已理解");
                    }
                })
                .onForwardToSettings(new ForwardToSettingsCallback() {
                    @Override
                    public void onForwardToSettings(ForwardScope scope, List<String> deniedList) {
                        scope.showForwardToSettingsDialog(deniedList, "您需要去应用程序设置傍边手动开启权限", "我已理解");
                    }
                })
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted) {
                            Toast.makeText(MainActivity.this, "所有请求的权限都已经过", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this, "您回绝了如下权限:" + deniedList, Toast.LENGTH_SHORT).show();
                        }
                    }
                });

Android11 往手机里中写txt文件

二 往内存里写txt文件

这有一函数:

public void writeTxtToStorage(String mFileName,String mContent,boolean flag){
        File file = new File( MainActivity.this.getExternalFilesDir(null).getPath()+ "/" + mFileName);
        FileOutputStream fos = null;
        try {
            if (!file.exists()) {
                File parentDir = new File(file.getParent());
                if (!parentDir.exists()) {
                    parentDir.mkdirs();
                    file.createNewFile();
                }
            }
            fos = new FileOutputStream(file, flag);
            fos.write(mContent.getBytes());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }

Android11 往手机里中写txt文件

第一个参数是文件名,带后缀,比如”test.txt”,第二个参数是要写入的内容,第三个参数为是否追加.

其实关键的是看第一句:

File file = new File( getFilesPath(MainActivity.this) + “/” + mFileName);

为何文件目录getFilesPath(MainActivity.this) 而不是我们熟悉的

Environment.getExternalStorageDirectory() 或者说二者有何区别?

前者是获取的app的目录,一般放在了Android/data/com/啥啥啥.

后者是获取的手机根目录,文件存放在了打开手机目录就能够看到的地方

你或许会问,啥时分用前者,啥时分用后者? 这儿就要看build.gradle文件中的内容了.

Android11 往手机里中写txt文件
Android11 往手机里中写txt文件

一般情况下,只要保证 minSdk<targetSdk<=compileSdk就能够.

可是,如果你写不进去根目录,你还不想改targetSdk的版本,你能够考虑往手机app目录下写,看看能否写进去.

如果,你就想写进去根目录,那你就能够考虑将targetSdk将降,一般26-29就很有或许呈现奇迹

上面说的处理办法一般是遇到以下两种问题的时分能够测验去处理

问题一:在已经请求权限了,但仍是呈现:

Android11 往手机里中写txt文件
Android11 往手机里中写txt文件

此时这两种办法都能够测验下,我试过的都是能够处理的.

最后提一嘴,不要忘了测验下在<application标签中加

android:requestLegacyExternalStorage=“true“