1

我正在尝试创建一个用户选择几个复选框的应用程序,然后当他们点击提交时,它会为每个选中的复选框创建一个包含一个句子的 .txt 文件。

我已经成功构建了这个文件,它正确地创建了文件,但我需要将它保存到一个可访问的文件位置,以便它可以附加到电子邮件中。我真的不在乎它保存到哪里,只要它是可访问的。

以下代码在 Android 虚拟设备和我的 Galaxy 2 中运行时会导致崩溃。该应用程序是以后应用程序的概念证明。谢谢你。

        @Override
        public void onClick(View v)
        {
             String nochartOutput = " ";    
             if (sitting.isChecked())
                 nochartOutput += "The patient was sitting in a chair. ";
             if (breathing.isChecked())
                 nochartOutput += "The patient was breathing. ";
             if (alert.isChecked())
                 nochartOutput += "The patient was alert. ";

             FileOutputStream fOut = null;
             File sdDir = Environment.getExternalStorageDirectory();
             try {
                 fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE);
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             }
             OutputStreamWriter osw = new OutputStreamWriter(fOut); 
             try {
                 osw.write(nochartOutput);

                 osw.flush();
                 osw.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
        }

03-04 18:39:53.604: W/dalvikvm(10453): threadid=1: 线程以未捕获的异常退出 (group=0x40c211f8)

03-04 18:39:53.624:E/AndroidRuntime(10453):致命异常:主要

03-04 18:39:53.624: E/AndroidRuntime(10453): java.lang.IllegalArgumentException: 文件 /mnt/sdcard/samplefile.txt 包含路径分隔符

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.app.ContextImpl.makeFilename(ContextImpl.java:1703)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.app.ContextImpl.openFileOutput(ContextImpl.java:723)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.content.ContextWrapper.openFileOutput(ContextWrapper.java:165)

03-04 18:39:53.624: E/AndroidRuntime(10453): at com.example.com.dresdor.autowriter.MainActivity$1.onClick(MainActivity.java:48)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.view.View.performClick(View.java:3620)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.view.View$PerformClick.run(View.java:14292)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.os.Handler.handleCallback(Handler.java:605)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.os.Handler.dispatchMessage(Handler.java:92)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.os.Looper.loop(Looper.java:137)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 android.app.ActivityThread.main(ActivityThread.java:4507)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 java.lang.reflect.Method.invokeNative(Native Method)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 java.lang.reflect.Method.invoke(Method.java:511)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)

03-04 18:39:53.624: E/AndroidRuntime(10453): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)

03-04 18:39:53.624: E/AndroidRuntime(10453): at dalvik.system.NativeStart.main(Native Method)

4

2 回答 2

3

您现有的代码是写入内部存储和外部存储的混搭。线

fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE);

尝试在应用程序的私有数据目录中创建文件,并且您只能将文件名传递给此方法,而不是更深的路径。这就是崩溃的来源,但这不是你想要的。

您开始创建外部存储路径,但从未实际使用过它。要将文件写入外部 SD 卡上的该位置,请修改您的代码,如下所示:

FileOutputStream fOut = null;
//Since you are creating a subdirectory, you need to make sure it's there first
File directory = new File(Environment.getExternalStorageDirectory(), "AutoWriter");
if (!directory.exists()) {
    directory.mkdirs();
}

try {
    //Create the stream pointing at the file location
    fOut = new FileOutputStream(new File(directory, "samplefile.txt"));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
OutputStreamWriter osw = new OutputStreamWriter(fOut);

//...etc...

使用 SD 卡可以让任何人访问该文件。

于 2013-03-05T04:00:56.567 回答
2

openFileOutput() 将文件写入内部存储器而不是 sd 卡。所以改变

fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE);

fOut = openFileOutput("samplefile.txt", MODE_WORLD_READABLE);

此外,文件名不能包含路径分隔符。请参阅Android 开发者参考

public abstract FileOutputStream openFileOutput (String name, int mode)

打开与此上下文的应用程序包关联的私有文件进行写入。如果文件尚不存在,则创建该文件。

参数 name 要打开的文件的名称;不能包含路径分隔符

然后可以像这样访问该文件。

FileInputStream fis = openFileInput("samplefile.txt");

注意: 对于较大的文件,最好将其保存在 sd 卡中。这是代码片段。

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
    FileOutputStream fos = null;
    try {
        File rootPath = new File(Environment.getExternalStorageDirectory(), "AutoWriter");
        if (!rootPath.exists()) 
            rootPath.mkdirs();

        File file = new File(rootPath, "samplefile.txt");
        fos = new FileOutputStream(file);

        // ... more lines of code to write to the output stream

    } catch (FileNotFoundException e) {
        Toast.makeText(this, "Unable to write file on external storage", Toast.LENGTH_LONG).show();
    } finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {}
        }
    }
}
于 2013-03-05T03:30:29.723 回答