我想将一些文件保存在SDCard Documents文件夹的子文件夹中。我看了很多帖子,最后我没有任何异常,似乎文件存储很好,但是当我将手机连接到comp时,我仍然看不到文件夹,也没有文件。
修改
这只发生在设备上,在模拟器上,文件已创建
我已在清单文件中授予权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我已经要求用户提供写入权限,并且已获得批准。这个帖子 This post helped me in granting permission
这是我的代码
if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
Toast.makeText(_ctx, "There is no external storage", Toast.LENGTH_LONG).show();
} else {
File docfolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
docfolder.mkdirs();
if (!docfolder.exists()) {
Toast.makeText(_ctx, "Documents doesn't exist", Toast.LENGTH_LONG).show();
}
File folder = new File(docfolder, foldername);
folder.mkdirs(); //make if not exist
boolean isPresent = folder.exists();
if (isPresent) {
File file = new File(folder.getAbsolutePath(), filename);
try {
OutputStream os = new FileOutputStream(file);
os.write(xml.getBytes());
os.close();
} catch (IOException e) {
Toast.makeText(_ctx, e.toString(), Toast.LENGTH_LONG).show();
Log.w("ExternalStorage", "Error writing " + file, e);
}
catch (Exception e) {
Toast.makeText(_ctx, e.toString(), Toast.LENGTH_LONG).show();
Log.w("ExternalStorage", "Error writing 2 " + file, e);
}
} else {
Toast.makeText(_ctx, "cannot make directory " + foldername, Toast.LENGTH_LONG).show();
Log.w("ExternalStorage", "cannot make directory " + foldername);
}
欢迎任何提示!
修改
也许问题可能是这段代码将文件保存到该路径中?
/storage/emulated/0/Documents/IBHTrack/ibhTrack_GPX_20170706153858.xml
然而,因为我使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
方法,我不知道如何获得真正的SDCard路径
答案 0 :(得分:0)
首先检查权限:
void checkPermission(Activity thisActivity){
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
Toast.makeText(MainActivity.this,"Permission denied, now log will not write in storage.",Toast.LENGTH_SHORT).show();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
101);
}
}else {
processFileLog(messageForLog);
}
}
然后处理许可的回复:
@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
switch (requestCode) {
case 101: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
processFileLog(messageForLog);
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(MainActivity.this,"Permission denied, now log will not write in storage.",Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
使用此方法,您可以将数据记录到文件中:
/**
* Tag value
*/
private static final String mTag = "Logs";
/**
* File
*/
private static File mLogFolder = null;
private static void writeLog() {
if (isExternalStorageWritable()) {
mLogFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
"/app-client-logs");
if (!mLogFolder.exists()) {
if (!mLogFolder.mkdirs()) {
System.out.println("Unable to create the log folder");
}
}
} else {
System.out.println("SD Card not available for read and write");
}
}
public static void processFileLog(final String message) {
writeLog();
File file = new File(mLogFolder, mTag + ".log");
try {
BufferedWriter buf = new BufferedWriter(new FileWriter(file, true));
String currentDateTimeString = DateFormat.getDateTimeInstance().format(System.currentTimeMillis());
buf.append("\nSafety Net Request "+currentDateTimeString).append(":\n").append(message);
buf.newLine();
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}