本文已参与「新人创作礼」活动,一起开启掘金创作之路。
谨以此篇来记录往Android内存中写txt文件踩过的坑.
一 申请权限
当你无法将txt文件写不进去的时候,大部分人会说你没有动态申请权限啊啥啥的,而且网上动态申请权限的方法每个人写的不尽相同,大部分的做法是申请权限,然后去check下是否申请了,授权了咋办,拒绝了咋办........
但有的时候,你写不进去他不一定是因为你没有动态申请权限啊,然后你就按那个人的弄弄,复制下那个人的.....陷入下面的循环中.......
while(写不进去){
复制
注释
}//死循环
一定要对自己的申请权限的代码有信息,写不进去有可能不是因为我的权限申请有问题,只要app赋予了下面俩权限,就要考虑是不是不是权限的问题
Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE
前面说了,动态申请权限网上的方法不尽相同,直到遇到郭大神的 permissionx
如何使用 permissionx
这有一链接permissionx的仓库地址
然后将内容复制待build.gradle中的依赖中,如图所示:
然后在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();
}
}
});
二 往内存里写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 {
}
}
第一个参数是文件名,带后缀,比如"test.txt",第二个参数是要写入的内容,第三个参数为是否追加.
其实关键的是看第一句:
File file = new File( getFilesPath(MainActivity.this) + "/" + mFileName);
为何文件目录是getFilesPath(MainActivity.this) 而不是我们熟悉的
Environment.getExternalStorageDirectory() 或者说二者有何区别?
前者是获取的app的目录,一般放在了Android/data/com/啥啥啥.
后者是获取的手机根目录,文件存放在了打开手机目录就可以看到的地方
你可能会问,啥时候用前者,啥时候用后者? 这里就要看build.gradle文件中的内容了.
一般情况下,只要保证 minSdk<targetSdk<=compileSdk就可以.
但是,如果你写不进去根目录,你还不想改targetSdk的版本,你可以考虑往手机app目录下写,看看能否写进去.
如果,你就想写进去根目录,那你就可以考虑将targetSdk将降,一般26-29就很有可能出现奇迹
上面说的解决方法一般是遇到以下两种问题的时候可以尝试去解决
问题一:在已经申请权限了,但还是出现:
此时这两种方法都可以尝试下,我试过的都是可以解决的.
最后提一嘴,不要忘了尝试下在<application标签中加
android:requestLegacyExternalStorage=“true“