web-dev-qa-db-ja.com

SDカードへのテキストファイルの書き込みに失敗する

私は遭遇した奇妙な問題を抱えています。私のアプリはSDカードに簡単なテキストファイルを書き込むことができますが、一部の人には機能するが他の人には機能しない場合があり、その理由がわかりません。

一部の人にとっては、ファイルなどに...のような文字を入れると、強制的に閉じます。トラブルがなかったので再現できないようですが、これがファイル書き込みを処理するコードです。誰かが問題につながる可能性のある何か、またはそれを行うためのより良い方法を考えることができますか?

public void generateNoteOnSD(String sFileName, String sBody)
{
    try
    {
        File root = new File(Environment.getExternalStorageDirectory(), "Notes");
        if (!root.exists()) 
        {
            root.mkdirs();
        }

        File gpxfile = new File(root, sFileName);
        FileWriter writer = new FileWriter(gpxfile);
        writer.append(sBody);
        writer.flush();
        writer.close();

        Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
    }
    catch(IOException e)
    {
         e.printStackTrace();
         importError = e.getMessage();
         iError();
    }
}   
10
Paul

このメソッドを使用して、desdCardの状態を確認できます。トーストダイアログをあなたの言語に変更します。

** MEDIA_MOUNTED_READ_ONLYに注意してください。 SDカードに書き込む必要はなく、trueを返します**

public static Boolean comprobarSDCard(Context mContext) {
    String auxSDCardStatus = Environment.getExternalStorageState();

    if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED))
        return true;
    else if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
        Toast.makeText(
                mContext,
                "Warning, the SDCard it's only in read mode.\nthis does not result in malfunction"
                        + " of the read aplication", Toast.LENGTH_LONG)
                .show();
        return true;
    } else if (auxSDCardStatus.equals(Environment.MEDIA_NOFS)) {
        Toast.makeText(
                mContext,
                "Error, the SDCard can be used, it has not a corret format or "
                        + "is not formated.", Toast.LENGTH_LONG)
                .show();
        return false;
    } else if (auxSDCardStatus.equals(Environment.MEDIA_REMOVED)) {
        Toast.makeText(
                mContext,
                "Error, the SDCard is not found, to use the reader you need "
                        + "insert a SDCard on the device.",
                Toast.LENGTH_LONG).show();
        return false;
    } else if (auxSDCardStatus.equals(Environment.MEDIA_SHARED)) {
        Toast.makeText(
                mContext,
                "Error, the SDCard is not mounted beacuse is using "
                        + "connected by USB. Plug out and try again.",
                Toast.LENGTH_LONG).show();
        return false;
    } else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTABLE)) {
        Toast.makeText(
                mContext,
                "Error, the SDCard cant be mounted.\nThe may be happend when the SDCard is corrupted "
                        + "or crashed.", Toast.LENGTH_LONG).show();
        return false;
    } else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTED)) {
        Toast.makeText(
                mContext,
                "Error, the SDCArd is on the device but is not mounted."
                        + "Mount it before use the app.",
                Toast.LENGTH_LONG).show();
        return false;
    }

    return true;
}
15
Aracem

外部ストレージが書き込み可能であることを確認していますか?そうでない場合は、使用してみてください...

Environment.getExternalStorageState()

これにより、SDカードがマウントされているかどうかがわかり、書き込み可能かどうかも確認できます。この時点で私が提案できるのはそれだけです。

6
Squonk

私の場合、マニフェストファイルに<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />を追加できなかったことがわかりました。

乾杯、

ワヒブ

5
Wahib Ul Haq

USBを介して実際のデバイスでデバッグしているすべての初心者の場合:私が行ったように、開発用PCからUSBケーブルを抜くことを忘れないでください。 USBが接続されている場合、SDカードは使用できません。ハッピーファイル書き込み...

これは、すべての電話/ ROMビルドで正しいわけではありません。 CMod7とMIUIROMSはどちらも、PCに接続したときにSDカードをマウントするかどうかを設定できます。設定によっては、上記が当てはまる場合があります。確認するのが最善です。

3
Mike Davis

私は通常、FileWriterではなく PrintWriter を使用します。それがあなたの問題を解決するかどうかはわかりませんが、それはより高いレベルなので、単純なFileWriterよりも多くのことを処理する可能性があります。

0
Kevin Gaudin