FileNotFoundException:EACCES(权限被拒绝)

FileNotFoundException:EACCES (Permission denied)

我从我的服务获取数据:

        JSONObject userGuid = new JSONObject();
        userGuid.put("userGuid", id);
        Bitmap bitmap = null;
        String response = HttpUtil.post(mService + "GetUser", userGuid.toString(), mCookie);

        JSONObject result = new JSONObject(response).getJSONObject("User");
        String temp = result.getJSONArray("UserImage").toString();

在收到的数据中,有一个Base64图像用户,我得到它并将其转换为arryByte,然后我将其转换为输入流 :

        byte[] tmp = Base64.decode(temp, Base64.DEFAULT);
        InputStream is = new ByteArrayInputStream(tmp);

我想通过 outputStream 将其写入 File :

OutputStream os = new FileOutputStream(f);

但是我得到了这个错误:

java.io.FileNotFoundException: /storage/emulated/0/fcImages/581864034: open failed: EACCES (Permission denied)

在清单中我添加了这些权限:

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

你的想法是什么?

编辑 我以这种方式创建文件:

public class FileCache {

private File cacheDir;

public FileCache(Context context) {

    if((Environment
            .getExternalStorageState()).equals(Environment.MEDIA_MOUNTED)) {
            cacheDir = new File(Environment.getExternalStorageDirectory(), "fcImages");
    } else {
        cacheDir = context.getCacheDir();
    }
    if(!cacheDir.mkdirs()) {
        cacheDir.mkdirs();
    }
}

public File getFile(String id) {
    String filename = String.valueOf(id.hashCode());
    File f = new File(cacheDir, filename);
    return f;
}

我想到要检查的 3 件事:

  1. uses-permission 标签在清单标签内(而不是应用程序标签)
  2. EACCESS可能是因为fcImages目录不存在,或者是一个文件
  3. Androidapi23 的权限必须在运行时请求

(1) 的来源是这个 answer, while source for (3) is this answer

如果您正在将文件写入应用程序的内部存储。试试这个:

示例 1:

java.io.File xmlFile = new java.io.File((getActivity()
      .getApplicationContext().getFileStreamPath("FileName.xml")
      .getPath()));

另外给manifest权限正确的方式如下:

示例 2:

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