Принудительно закрыть при записи на SD-карту (Android) - PullRequest
1 голос
/ 22 февраля 2012

У меня есть приложение, которое выполняет резервное копирование данных на SD-карту.Когда SD-карта вставлена, она прекрасно работает и сделает резервную копию данных.Когда SD-карта отсутствует, я запрограммировал ее, чтобы создать предупреждение о том, что SD-карта не найдена.

Проблема, с которой я столкнулся, заключается в том, что если кто-то попытается экспортировать данные в первый раз без SD-карты, он принудительно закроется.Однако, если они сначала делают резервную копию набора данных, а затем не имеют SD-карты, когда пытаются сделать резервную копию большего количества данных, появляется предупреждение, как я хочу.

Кто-нибудь, помогите, пожалуйста!Вот мой код (модифицированный из учебника):

InputStream myInput;

try {

    myInput = new FileInputStream("/data/data/com.android.footprint/databases/MY_DATABASE");

    File directory = new File("/sdcard/Footprint");

    if (!directory.exists()) 
    {
        directory.mkdirs();
    } 


    OutputStream myOutput = new FileOutputStream(directory.getPath()+ "/MY_DATABASE.backup");


    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0)
    {
        myOutput.write(buffer, 0, length);
    }

    myOutput.flush();

    myOutput.close();

    myInput.close();

    alertDialog2 = new AlertDialog.Builder(
            settings.this).create();
    alertDialog2.setTitle("Export Complete");
    alertDialog2.setMessage("Data Backup successful");
    alertDialog2.setButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            alertDialog2.dismiss();
        }
    });
    alertDialog2.show();

} catch (FileNotFoundException e) {
    alertDialog2.dismiss();
    alertDialog3 = new AlertDialog.Builder(
            settings.this).create();
    alertDialog3.setIcon(R.drawable.delete);
    alertDialog3.setTitle("Export Failed");
    alertDialog3.setMessage("Make sure SD card is inserted and unmounted");
    alertDialog3.setButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            alertDialog3.dismiss();
        }
    });
    alertDialog3.show();
} catch (IOException e) {
    alertDialog2.dismiss();
    alertDialog3 = new AlertDialog.Builder(
            settings.this).create();
    alertDialog3.setIcon(R.drawable.delete);
    alertDialog3.setTitle("Export Failed");
    alertDialog3.setMessage("Make sure SD card is inserted and unmounted");
    alertDialog3.setButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            alertDialog3.dismiss();
        }
    });
    alertDialog3.show();
} catch (Exception e) {
    alertDialog2.dismiss();
    alertDialog3 = new AlertDialog.Builder(
            settings.this).create();
    alertDialog3.setIcon(R.drawable.delete);
    alertDialog3.setTitle("Export Failed");
    alertDialog3.setMessage("Make sure SD card is inserted and unmounted");
    alertDialog3.setButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            alertDialog3.dismiss();
        }
    });
    alertDialog3.show();
}

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Не уверен, что это ваша проблема, но было бы неплохо проверить, как вы проверяете наличие SD-карты. Вот как я справился с этим в одном из моих последних приложений:

    String state = Environment.getExternalStorageState();

    if (Environment.MEDIA_MOUNTED.equals(state)) {
        // Everything is fine, write away !
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        // Card is in read mode, cannot write
        Log.e("FileManager", "SD Card is in READ ONLY mode, impossible to write files.");
    } else {
        // Impossible to access SD Card
        Log.e("FileManager", "Having trouble with SD card, can't write nor read from it.");
    }

Кроме того, могу ли я предложить вам получить ваш путь от статического метода, найденного в Environement классе, например:

    File root = Environment.getExternalStorageDirectory();
    File directory = new File(root + "/Footprint");

Надеюсь, это поможет вам решить вашу проблему!

2 голосов
/ 22 февраля 2012

используйте этот код для проверки SD-карты:

public static boolean isSdPresent() {
    return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
}

Я нашел это по этой ссылке .Надеюсь, это поможет ..

...