IOException при попытке доступа к SD-карте с Android - PullRequest
0 голосов
/ 30 марта 2011

все.Я пытаюсь сохранить изображение с Android в общедоступном каталоге изображений на SD-карте.Тем не менее, я не могу открыть файл для записи.Вот код:

                boolean mExternalStorageWriteable = false;
            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state)) {

               mExternalStorageWriteable = true;
            } 

            if(mExternalStorageWriteable){
                    File root_dir = Environment.getExternalStorageDirectory();
                    root_dir.mkdirs();
                    File pictures_directory = new File(root_dir, "/Pictures/");
                    pictures_directory.mkdirs();
                    File outputfile = new File(pictures_directory, "test_file.jpg");
                    try {
                        outputfile.createNewFile();
                        FileOutputStream out = new FileOutputStream(outputfile);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }

Мой отладчик всегда переходит к блоку перехвата (вызванному вызовом createNewFile), и сообщение IOExceptions - «Не каталог».Если я удалю вызов createNewFile, конструктор FileOutPutStream вызовет исключение FileNotFound.Однако открытие потока вывода файла в корень файловой системы или в каталог с картинками работает нормально.

Чтобы обойтись без очевидного, мой манифест включаеттег.Я использую API уровня 5, и в моем эмуляторе установлена ​​виртуальная SD-карта.Любые предложения приветствуются.

решено: возникла проблема с файловой системой эмулятора.DDMS показывал / Pictures /, создаваемый в виде файла или каталога по какой-то причине.Создание нового эмулятора решило проблему.

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Обычно это плохо для жестких разделителей пути кодера. Попробуйте просто Pictures вместо /Pictures/. Последний является абсолютным путем, который указывает на папку в корне:

File pictures_directory = new File(root_dir, "Pictures");

UPD:

Я скомпилировал и запустил ваш код без проблем. Так что проблема в вашей файловой системе эмулятора. Попробуйте сначала удалить этот файл Pictures или даже создать новый образ SDCard для вашего эмулятора.

0 голосов
/ 30 марта 2011

Попробуйте этот метод. Убедитесь, что у вас есть test_file.jpg в вашем каталоге res / drawable.

    private void writeToSDCard() {
    try {
        File root = Environment.getExternalStorageDirectory();

        if (root.canWrite()){
            InputStream from = getBaseContext().getResources().openRawResource(R.drawable.test_file);
            File dir = new java.io.File (root, "Pictures");
            dir.mkdir();
            File writeTo = new File(root, "Pictures/test_file.jpg");
            FileOutputStream  to = new FileOutputStream(writeTo);

            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = from.read(buffer)) != -1)
                to.write(buffer, 0, bytesRead); // write
            to.close();             
            from.close();
        } else {
            Log.d("MyActivity", "Unable to access SD card.");
        }
    } catch (Exception e) {
        Log.d("MyActivity", "writeToSDCard: " + e.getMessage());
    }
}   "
0 голосов
/ 30 марта 2011

Вы путаете следующие два метода:

File(String Path) и File(File dir, String name)

Таким образом, каталог images_ должен быть каталогом, а не полным путем + имя файла.

Попробуйте изменить

File pictures_directory = new File(root_dir, "/Pictures/");

на

File pictures_directory = new File(root_dir + "/Pictures/");
...