java.io.FileNotFoundException Доступ запрещен в Android

Я пытаюсь сохранить свой выходной файл во внутренней памяти, но он выдает исключение java.io.FileNotFoundException. Доступ запрещен.

private boolean crop() {
    try {
        FileOutputStream fos = null;
        String filePath = CustomVideoGalleryActivity.videoPath.get(0);
      Movie originalMovie = MovieCreator.build(filePath);

      Track track = originalMovie.getTracks().get(0);
      Movie movie = new Movie();
      movie.addTrack(new AppendTrack(new CroppedTrack(track, 200, 800)));

      Container out = new DefaultMp4Builder().build(movie);
      String outputFilePath = Environment.getDataDirectory()+ "/output_crop.mp4";
      fos = new FileOutputStream(new File(outputFilePath)); //throws Exception
      out.writeContainer(fos.getChannel());
      fos.close();
      mProgressDialog.dismiss();
      finish();

    } catch (Exception e) {
        Log.v("ONMESSAGE", e.toString());
      e.printStackTrace();
      mProgressDialog.dismiss();
      return false;
    }
    return true;
  }

person Sritam Jagadev    schedule 09.03.2015    source источник


Ответы (2)


Вам необходимо запросить разрешение на запись в вашем AndroidManifest.xml. В частности, должна присутствовать следующая строка:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person Saran    schedule 09.03.2015
comment
Сэр, я хочу сохранить его во внутренней памяти моего устройства. Я уже добавил разрешение android.permission.WRITE_EXTERNAL_STORAGE в свой файл манифеста. но он не работает - person Sritam Jagadev; 09.03.2015
comment
Упс, моя ошибка. Вы не можете писать /data. См. stackoverflow.com/questions/1998400/ - person Saran; 09.03.2015
comment
Нет, сэр. За несколько дней до того, как я уже проверил свою программу. Она работала нормально. Она сохраняла мой выходной файл во внутренней памяти моего устройства. Но теперь она показывает исключение в моем логарифме. - person Sritam Jagadev; 09.03.2015
comment
Вы обновляли свое устройство с тех пор? (С 3.х на 4.х?) - person RaphMclee; 17.04.2015

Вы не должны смотреть на каталог данных. Это системный каталог в памяти телефона — обычно /data — и ваше приложение никогда не будет иметь разрешения на запись в него.

Каталог, в который ваше приложение должно записывать файлы, возвращается методом Context.getFilesDir(). Это будет что-то вроде /data/data/com.yourdomain.YourApp/files.

Если вы хотите записать файл в память телефона, используйте метод Context.openFileOutput().

Если вам нужен путь к SDCard, используйте метод Environment.getExternalStorageDirectory(). Чтобы записать на SDCard, вам нужно предоставить вашему приложению соответствующие разрешения, добавив в свой манифест следующее:

If you're going to write to the SDCard you'll also need to check its state with the getExternalStorageState() method.

Если вы храните небольшие файлы для своего приложения, они могут попасть в память телефона, а не на SD-карту, поэтому используйте методы Context.openFileOutput() и Context.openFileInput().

Итак, в вашем коде рассмотрите что-то вроде:

OutputStream os = openFileOutput("samplefile.txt", MODE_PRIVATE);
BufferedWriter lout = new BufferedWriter(new OutputStreamWriter(os));
person Akshay Paliwal    schedule 09.03.2015