【问题标题】:Saving data in external storage. FileNotFoundException将数据保存在外部存储器中。 FileNotFoundException
【发布时间】:2017-11-30 16:12:12
【问题描述】:

我正在尝试将数据保存在外部存储中。但我得到一个 FileNotFoundException。

我在网上查找并在 Manifest 中包含了所需的权限并通过“mkdirs()”创建了该文件夹我正在模拟器上对其进行测试 - Nexus 6 API 23。

你能建议我哪里做错了吗?

 @Override
    public void saveExternalPublic(String data) {
        File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        File myFile = new File(folder, "myData4.txt");
        folder.mkdirs();
        writeData(myFile, data);
    }

 @Override
    public void writeData(File myFile, String data) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(myFile);
            fileOutputStream.write(data.getBytes());
            cacheSaveView.showMessage(data + " was written successfully "+ myFile.getAbsolutePath());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if(null != fileOutputStream) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

权限

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

错误日志

11-30 00:51:43.178 23490-23490/com.example.rao.cachingsample W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Download/myData4.txt: open failed: EACCES (Permission denied)
11-30 00:51:43.180 23490-23490/com.example.rao.cachingsample W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:452)
11-30 00:51:43.180 23490-23490/com.example.rao.cachingsample W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
11-30 00:51:43.180 23490-23490/com.example.rao.cachingsample W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:     at com.example.rao.cachingsample.Caching.Presenter.CacheSavePresenterImpl.writeData(CacheSavePresenterImpl.java:60)
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:     at com.example.rao.cachingsample.Caching.Presenter.CacheSavePresenterImpl.saveExternalPublic(CacheSavePresenterImpl.java:53)
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:     at com.example.rao.cachingsample.Caching.View.FCacheSave.saveExternalPublic(FCacheSave.java:82)
11-30 00:51:43.181 23490-23490/com.example.rao.cachingsample W/System.err:     at com.example.rao.cachingsample.Caching.View.FCacheSave_ViewBinding$4.doClick(FCacheSave_ViewBinding.java:63)
11-30 00:51:43.182 23490-23490/com.example.rao.cachingsample W/System.err:     at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
11-30 00:51:43.182 23490-23490/com.example.rao.cachingsample W/System.err:     at android.view.View.performClick(View.java:5198)
11-30 00:51:43.183 23490-23490/com.example.rao.cachingsample W/System.err:     at android.view.View$PerformClick.run(View.java:21147)
11-30 00:51:43.184 23490-23490/com.example.rao.cachingsample W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
11-30 00:51:43.185 23490-23490/com.example.rao.cachingsample W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-30 00:51:43.185 23490-23490/com.example.rao.cachingsample W/System.err:     at android.os.Looper.loop(Looper.java:148)
11-30 00:51:43.185 23490-23490/com.example.rao.cachingsample W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-30 00:51:43.192 23490-23490/com.example.rao.cachingsample W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
11-30 00:51:43.193 23490-23490/com.example.rao.cachingsample W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-30 00:51:43.198 23490-23490/com.example.rao.cachingsample W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-30 00:51:43.199 23490-23490/com.example.rao.cachingsample W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
11-30 00:51:43.211 23490-23490/com.example.rao.cachingsample W/System.err:     at libcore.io.Posix.open(Native Method)
11-30 00:51:43.215 23490-23490/com.example.rao.cachingsample W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
11-30 00:51:43.216 23490-23490/com.example.rao.cachingsample W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:438)

【问题讨论】:

标签: android caching filenotfoundexception android-external-storage


【解决方案1】:

你应该先创建目录,然后再创建文件。

    File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    folder.mkdirs();
    File myFile = new File(folder, "myData4.txt");
    writeData(myFile, data);

【讨论】:

  • 顺序无关紧要。而且你的代码和原始代码一样糟糕,同时没有检查 mkdirs 的返回值。
【解决方案2】:

转到此链接以获得运行时权限。 https://www.androidhive.info/2016/11/android-working-marshmallow-m-runtime-permissions/

从 API 23 开始意味着 Android 6.0(lollipop) 只有 Manifest Permission 不足以访问任何权限。您必须提供运行时权限对话框以在相关屏幕上向用户请求权限。

【讨论】:

    【解决方案3】:

    从 Android 6 开始,您必须在运行时请求权限。查看更多here

    对于测试,您可以自己启用它们。您选择设置->应用程序->选择您的应用程序->选择权限部分->启用所有权限

    要知道在运行时需要请求哪些权限。你应该看看my answer

    【讨论】:

      【解决方案4】:

      您需要在运行时在 android API 23+ 中询问权限,即使您已经在清单中声明了权限

      public static void StoragePermissions(Activity activity) {
      // Check if we have write permission
      int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
      
      if (permission != PackageManager.PERMISSION_GRANTED) {
          // We don't have permission so prompt the user
          ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE
          );
         }
       }
      

      还要检查您是否在 application Tag 中声明了清单权限。在以下链接中查看更多信息: Exception 'open failed: EACCES (Permission denied)' on Android 以及更多Android Docs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多