【问题标题】:Can't create file in sd-card无法在 SD 卡中创建文件
【发布时间】:2013-05-01 12:36:17
【问题描述】:

我正在尝试将位图保存到文件中,然后将其保存到 sd 卡上。 这是我的代码:

String path = Environment.getExternalStorageDirectory().toString();
File file = new File(path, "Jhs"+".jpg");
file.mkdir();
OutputStream fOut;
try {
    fOut = new FileOutputStream(file);
    BitmapMatrix convMatrix = new BitmapMatrix(0);
    convMatrix.result.compress(Bitmap.CompressFormat.JPEG, 100, fOut);

    fOut.flush();
    fOut.close();
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

此外,此代码位于不扩展 Activity 的类中。我只是提供此信息,认为这可能存在一些问题。 这是我的 LogCat

05-01 18:00:22.555: W/System.err(31392): java.io.FileNotFoundException:           /mnt/sdcard/Jhs.jpg (Permission denied)
05-01 18:00:22.555: W/System.err(31392):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
05-01 18:00:22.555: W/System.err(31392):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
05-01 18:00:22.555: W/System.err(31392):    at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
05-01 18:00:22.555: W/System.err(31392):    at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
05-01 18:00:22.555: W/System.err(31392):    at com.example.imageprocess.BitmapMatrix.computeConvolution3x3(BitmapMatrix.java:123)
05-01 18:00:22.555: W/System.err(31392):    at com.example.imageprocess.MainActivity.sharpen(MainActivity.java:105)
05-01 18:00:22.555: W/System.err(31392):    at com.example.imageprocess.MainActivity.onCreate(MainActivity.java:51)
05-01 18:00:22.555: W/System.err(31392):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread.access$1500(ActivityThread.java:135)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054)
05-01 18:00:22.555: W/System.err(31392):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-01 18:00:22.565: W/System.err(31392):    at android.os.Looper.loop(Looper.java:150)
05-01 18:00:22.565: W/System.err(31392):    at android.app.ActivityThread.main(ActivityThread.java:4389)
05-01 18:00:22.565: W/System.err(31392):    at java.lang.reflect.Method.invokeNative(Native Method)
05-01 18:00:22.565: W/System.err(31392):    at java.lang.reflect.Method.invoke(Method.java:507)
05-01 18:00:22.565: W/System.err(31392):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
05-01 18:00:22.565: W/System.err(31392):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
05-01 18:00:22.565: W/System.err(31392):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • @Tom 格式编辑一个旧问题没有多大意义,该问题在没有有意义的解决方案的情况下被放弃,并且很可能与许多其他问题重复 - 您最终要做的就是将其拉到顶部页面,分散值得关注的问题。

标签: android file bitmap sd-card


【解决方案1】:

那个 logcat 说你没有写文件的权限, 确保您已声明

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

在 android 清单中。

你可以添加这个:

File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()+ "/%YOUR_FOLDER%/");
if (!(dir.exists() && dir.isDirectory())) {
    dir.mkdirs();
}

如果您想为文件尝试不同的文件夹位置并查看是否有帮助,请在当前代码上方。该代码将创建目录 /sdcard/Downloads/YOUR_FOLDER/ ,您可以在其中创建文件。有关存储位置选项,请参阅 here

你可以这样做

File file = new File(dir, "Jhs"+".jpg");
file.createNewFile(); //CREATE THE FILE FIRST!
OutputStream fOut;
try {
    fOut = new FileOutputStream(file);
    ....
}

等你的帖子。

【讨论】:

  • 您确定要创建文件的位置存在于文件系统中吗?我已经编辑了答案以包含代码以检查目录是否存在,如果不存在,请创建它
  • 另外,尝试更改“String path = Environment.getExternalStorageDirectory().toString();”到“字符串路径 = Environment.getExternalStorageDirectory().toString().getPath();”
  • 再想一想,您正在运行以获取 logcat 的设备没有将 sdcard 安装为 PC 的外部存储,是吗?这会导致权限错误。就像没有安装 SD 卡一样。
【解决方案2】:

鉴于您遇到的异常,您需要向您的AndroidManifest.xml 提交WRITE_EXTERNAL_STORAGE 权限

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

【讨论】:

    【解决方案3】:

    java.io.FileNotFoundException: /mnt/sdcard/Jhs.jpg(权限被拒绝)

    在清单中添加此权限

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

    【讨论】:

    • 您正在放置文件。所以删除file.mkdir();,因为它将创建一个目录并使用file.createNewFile()
    • 我也试过了,但仍然显示同样的错误。我正在尝试是否可以创建一个新目录而不是文件。但是代码根本不起作用
    【解决方案4】:
     java.io.FileNotFoundException: /mnt/sdcard/Jhs.jpg (Permission denied)
    

    您似乎没有WRITE_EXTERNAL_STORAGE 权限。

    将此添加到您的 AndroidMAnifest.xml:

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

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      相关资源
      最近更新 更多