java由于mkdirs()的原因,我无法在外部目录中备份我的领域数据库
我正在尝试将我的领域数据库导出到外部存储中(实际上是在我的手机中)
当我按下下面的按钮时,名为backupRealmNow()
的方法可以工作
public void backupRealmNow() {
Realm nowRealmForBackup = Realm.getDefaultInstance();
String filePath = "";
try {
File dir = new File(Environment.DIRECTORY_DOWNLOADS);
File exportRealmFile = new File(Environment.DIRECTORY_DOWNLOADS, "backup.realm");
filePath = exportRealmFile.getPath();
if(!dir.exists()) {
dir.mkdirs();
}
if(!exportRealmFile.exists()) {
exportRealmFile.mkdirs();
Log.d("Path", "mkdirs :: " + filePath);
}
if(exportRealmFile.exists()) {
exportRealmFile.delete();
nowRealmForBackup.writeCopyTo(exportRealmFile);
Log.d("Backup", "Success to backup " + filePath);
} else {
Log.d("Backup", "Failed to Backup");
}
} catch(Exception e) {
e.printStackTrace();
} finally {
String msg = "File exported to Path: " + filePath;
Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_LONG).show();
Log.d(TAG, msg);
nowRealmForBackup.close();
}
}
当我运行上述代码时,我的logcat说
D/Path: mkdirs :: Download/backup.realm
D/Backup: Failed to Backup
D/ContentValues: File exported to Path: Download/backup.realm
我搜索了一段时间不起作用的原因,所以我检查了权限(因为我的手机运行在SDK 23 Marshmellow中),但是,我的权限被授予了。下面的代码正在检查MainActivity.java
中的权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this
, new String[]{安卓.Manifest.permission.WRITE_EXTERNAL_STORAGE, 安卓.Manifest.permission.READ_EXTERNAL_STORAGE}
, REQUEST_RWAVAILABLE);
} else {
Log.e("Read and Write", "PERMISSION GRANTED");
}
我的logcat说“允许”
我认为问题是exportRealmFile.mkdirs()
不起作用。你知道原因吗?(正如您在日志中看到的那样,Logcat在该代码处没有任何异常”
=========
编辑:backupRealmNow()
已更改为检查是否允许使用我的包
public void backupRealmNow() {
Realm nowRealmForBackup = Realm.getDefaultInstance();
int REQUESTCODE_WRITE = 100;
int REQUESTCODE_READ = 200;
String filePath = "";
try {
File dir = new File(Environment.DIRECTORY_DOWNLOADS);
File exportRealmFile = new File(Environment.DIRECTORY_DOWNLOADS, "backup.realm");
filePath = exportRealmFile.getPath();
if(!dir.exists()) {
dir.mkdirs();
}
if(!exportRealmFile.exists()) {
exportRealmFile.mkdirs();
if(exportRealmFile.exists()) {
Log.d("mkdirs", "Success to make dir");
} else {
Log.d("mkdirs", "Failed to make dir");
if(PermissionChecker.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PermissionChecker.PERMISSION_GRANTED) {
Log.e("PermissionChecker", "WRITE_EXTERNAL_STORAGE PERMISSION_DENIED so request.");
requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUESTCODE_WRITE);
} else {
Log.e("PermissionChecker", "WRITE_EXTERNAL_STORAGE PERMISSION_GRANTED");
}
if(PermissionChecker.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PermissionChecker.PERMISSION_GRANTED) {
Log.e("PermissionChecker", "READ_EXTERNAL_STORAGE PERMISSION_DENIED so request.");
requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, REQUESTCODE_READ);
} else {
Log.e("PermissionChecker", "READ_EXTERNAL_STORAGE PERMISSION_GRANTED");
}
}
}
if(exportRealmFile.exists()) {
exportRealmFile.delete();
nowRealmForBackup.writeCopyTo(exportRealmFile);
Log.d("Backup", "Success to backup " + filePath);
} else {
Log.d("Backup", "Failed to Backup");
}
} catch(Exception e) {
e.printStackTrace();
} finally {
String msg = "File exported to Path: " + filePath;
Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_LONG).show();
Log.d(TAG, msg);
nowRealmForBackup.close();
}
}
我的logcat说
D/mkdirs: Failed to make dir
E/PermissionChecker: WRITE_EXTERNAL_STORAGE PERMISSION_GRANTED
E/PermissionChecker: READ_EXTERNAL_STORAGE PERMISSION_GRANTED
D/Backup: Failed to Backup
D/ContentValues: File exported to Path: Download/backup.realm
# 1 楼答案
看看情况
即使
WRITE_EXTERNAL_STORAGE
被拒绝,并且不能保证会请求此权限,也可以false
这样做尝试将和运算符更改为或,以真正了解
WRITE_EXTERNAL_STORAGE
是否被授予。或者,您可以相互独立地检查和请求权限# 2 楼答案
您正试图在根目录(“/”)中创建目录“下载”。您需要使用
Environment.getExternalStoragePublicDirectory
来获取公共存储区域的路径,在那里您可以实际创建文件和目录