为什么我无法在Android中成功写入外部SD卡?

时间:2016-03-25 14:51:59

标签: android

我正在尝试将我的应用程序的日志文件写入外部SD卡。要弄清楚如何执行此操作,我一直在尝试按照示例 HERE

该网页上有一段约3/4的部分说:

  

如果没有预定义的子目录名称适合您的文件,则可以调用getExternalFilesDir()并传递null。这将返回外部存储上应用程序私有目录的根目录。

我的设备没有任何预先定义的目录,我也希望将我的数据保存到外部SD卡。使用以下命令:

$ ADB shell
shell@android:/ $ cd /mnt
shell@android:/ $ ls -F
d ext_sdcard

您可以看到我的外置SD卡。所以,我在外部SD卡上创建了一个目录:

shell@android:/ $ cd ext_sdcard
shell@android:/ $ mkdir MyAwesomeApplication
shell@android:/ $ ls -F
d MyAwesomeApplication

现在是我[使用]开发人员网站上的代码:

public File getDocumentStorageDir(String filename){
    File file = new File("/mnt/ext_sdcard/MyAwesomeApplication", filename);
    if(!file.getParentFile().mkdirs()){
        Log.i(MainActivity.class.getName(), "Directory Not Created!");
    }
    return file;
}

当我运行我的应用程序时,它有点工作;我立刻得到了这个错误:

E/myPackage.MainActivity: Directory Not Created!

但是它无论如何都会创建日志文件,并成功将数据写入文件。

我的问题是它总是用新数据覆盖日志文件,即使我正在使用它也不会附加:

public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

if(isExternalStorageWritable()){
    File logfile = getDocumenetStorageDir("mylogfile.log");
    PrintWriter logFileWriter = null;
    try {
        logFileWriter = new PrintWriter(logfile);
        logFileWriter.append("stuff ...");
    } catch(FileNotFoundException fnfe){
        Log.i(MainActivity.class.getName(), fnfe.getMessage());
    } finally {
        logFileWriter.close();
    }
}

现在,当我使用此命令时:

shell@android:/ $ cd MyAwesomeApplication
shell@android:/ $ ls -F
- mylogfile.log

我看到我的日志文件应该在哪里。但是当我使用这个命令时:

shell@android:/ $ cat mylogfile.log
// only the very latest piece of data is here

我在这里做错了什么?

由于

1 个答案:

答案 0 :(得分:-1)

您的问题有两个部分,我会尝试单独解决这些问题。

  1. 文件位置
  2. 你永远不应该像你一样硬编码文件位置(即使它只是调试日志记录)。位置<includesConstraint refId="myrule" severity="info" /> 可能适用于此设备,但这取决于Android和制造商的版本。您必须使用适当的getter方法来获取正确的目录。在THIS LINK上,您可以找到完整的解释,但根据我对您的用例的理解,您希望使用以下代码:

    File file = new File("/mnt/ext_sdcard/MyAwesomeApplication", filename);
    1. 附加到现有文件。
    2. 您没有显示您是如何创建public static File getLogFile(Context context) { File folder = getExternalFilesDir("logs"); if(!folder.exists()) { folder.mkdirs(); } return new File(folder, "mylogfile.log"); } 的,但我一直使用PrintWriter课程而没有任何附加问题。

      在这个问题中你可以看到(How to append to a text file in android?)。这里有一些代码

      FileWriter