1

ユーザーがいくつかのチェックボックスを選択し、送信を押すと、選択されたすべてのチェックボックスに文が含まれる.txtファイルが作成されるアプリを作成しようとしています。

これのビルドが1回成功し、ファイルが適切に作成されましたが、電子メールに添付できるように、アクセス可能なファイルの場所に保存する必要があります。アクセス可能である限り、どこに保存するかはあまり気にしません。

次のコードは、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):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(ネイティブメソッド)

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):dalvik.system.NativeStart.main(ネイティブメソッド)

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(文字列名、intモード)

このコンテキストのアプリケーションパッケージに関連付けられているプラ​​イベートファイルを開いて書き込みます。ファイルがまだ存在しない場合は、ファイルを作成します。

パラメータ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 に答える