【问题标题】:Android Mkdir Eacces Permission DeniedAndroid Mkdir Eacces 权限被拒绝
【发布时间】:2017-03-23 17:56:02
【问题描述】:

我需要帮助mkdir failed: EACCES (Permission denied)

我的构建设置; minSdkVersion 15 - targetSdkVersion 19 - compileSdkVersion 25 - buildToolsVersion "25.0.0"

我使用 Android Studio 2.3

调试设备:Samsung J1 (SM-J200F) Android 5.1.1 Android 安全补丁级别 2016-12-01

Sony Xperia Z5 (E6603) Android 7.0 Android 安全补丁级别 2016-12-01

但 Google Play APK 版本正在运行

Android 清单;

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

调试日志;

    Line 124 : `FileOutputStream out = new FileOutputStream(file);`

    `03-23 10:59:06.096 24568-24788/com.myAppName I/System.out: AsyncTask #1 calls detatch()
    03-23 10:59:06.106 24568-24568/com.myAppName W/System.err: mkdir failed: EACCES (Permission denied) : /storage/emulated/0/MyAppName
    03-23 10:59:06.106 24568-24568/com.myAppName D/Failed: Open
    03-23 10:59:06.106 24568-24568/com.myAppName W/System.err: java.io.FileNotFoundException: /storage/emulated/0/MyAppName/MyAppName-6662.jpg: open failed: ENOENT (No such file or directory)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:456)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at com.myAppName.helper.FileDownloadHelper.SaveImage(FileDownloadHelper.java:124)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at com.myAppName.helper.FileDownloadHelper.onPostExecute(FileDownloadHelper.java:59)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at com.myAppName.helper.FileDownloadHelper.onPostExecute(FileDownloadHelper.java:27)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:636)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at android.os.AsyncTask.access$500(AsyncTask.java:177)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at android.os.Looper.loop(Looper.java:145)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6946)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at libcore.io.Posix.open(Native Method)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:442)
    03-23 10:59:06.111 24568-24568/com.myAppName W/System.err:  ... 15 more`

我的保存功能;

    private Bitmap SaveImage(Bitmap result) {
        String filename = "";
        File instaFolder = new File(Environment.getExternalStorageDirectory().toString()
                + "/" + Constants.FOLDER_NAME);
        if (!instaFolder.exists())
            instaFolder.mkdir();

        Random generator = new Random();
        int n = 10000;
        n = generator.nextInt(n);
        filename = Constants.FOLDER_NAME + "-" + n + ".jpg";
        file = new File(instaFolder, filename);
        if (file.exists()) file.delete();
        _mImageUrl = file.getPath();
        try {
            FileOutputStream out = new FileOutputStream(file);
            result.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

【问题讨论】:

  • 你添加运行时权限了吗?
  • 我不添加运行时。因为我使用targetSdkVersion 19,targetSdkVersion 23 >=需要运行时权限
  • instaFolder.mkdir();。检查返回值,因为 mkdir 可能会失败。在这种情况下,它返回 false。如果它返回 false,则向用户显示敬酒。并返回。不要继续使用您的代码,因为尝试在不存在的目录中创建文件几乎没有意义。你现在做什么。
  • 我尝试使用 API 22,API 级别 22 不支持运行时权限

标签: android android-file


【解决方案1】:

试试这个:

检查mkdir()是否返回成功..并删除.toString()

 File folder = new File(Environment.getExternalStorageDirectory() +  "/" + Constants.FOLDER_NAME);
boolean success = true;
if (!folder.exists()) {
    success = folder.mkdir();
}
if (success) {
    Log.d("Success","Open");
    // Do work on success
} else {
     Log.d("Failed","Open");
    // Do work else on failure 
}

【讨论】:

  • 尝试在 onCreate() ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); 中添加这行代码不会有什么坏处,放权限代码...
  • 出了什么问题??
  • 我使用 Fyber 广告。 Fyber 阻止了我的后台服务。完成Fyber进程后,我通过启动自己的后台服务解决了问题
猜你喜欢
  • 2014-01-24
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2021-07-15
  • 2021-10-22
  • 2016-05-14
相关资源
最近更新 更多