java.io.FileNotFoundException Android中拒绝访问

时间:2015-03-09 11:52:14

标签: android java-io

我正在尝试将输出文件存储在内部存储器中。但它会抛出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;
  }

2 个答案:

答案 0 :(得分:1)

您需要AndroidManifest.xml中的ask for write permission。特别是,必须存在以下行:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 1 :(得分:1)

您不应该查看数据目录。这是手机存储中的系统目录 - 通常是/数据 - 您的应用程序永远不会有权写入它。

应用程序应该将文件写入的目录由Context.getFilesDir()方法返回。它将类似于/data/data/com.yourdomain.YourApp/files。

如果要写入手机存储中的文件,请使用Context.openFileOutput()方法。

如果您想要SDCard的路径,请使用Environment.getExternalStorageDirectory()方法。要写入SDCard,您需要通过将以下内容添加到您的Manifest来为您的应用程序提供适当的权限:

如果您要写入SDCard,您还需要使用getExternalStorageState()方法检查其状态。

如果你要存储与你的应用程序有关的小文件,那么它们可以进入手机的存储而不是SD卡,所以使用Context.openFileOutput()和Context.openFileInput()方法

因此,在您的代码中考虑以下内容:

OutputStream os = openFileOutput("samplefile.txt", MODE_PRIVATE);
BufferedWriter lout = new BufferedWriter(new OutputStreamWriter(os));