【问题标题】:FileNotFoundException:EACCES (Permission denied)FileNotFoundException:EACCES(权限被拒绝)
【发布时间】:2018-02-05 14:36:39
【问题描述】:

我从我的服务中获取数据:

        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 然后我将其转换为 InputStream

        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;
}

【问题讨论】:

  • 你测试的witch Android OS版本??
  • 我正在使用 api 23
  • 可能你需要阅读这篇文章。在尝试“使用”它之前,您必须在您的代码中获得许可:)。 developer.android.com/training/permissions/requesting.html
  • 同样的代码在这个 api 中是正确的,但唯一不同的是我使用 uri 获取图像然后编写它的另一个项目:URL imageUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection(); conn.setConnectTimeout(30000); conn.setReadTimeout(30000); conn.setInstanceFollowRedirects(true); InputStream is = conn.getInputStream(); OutputStream os = new FileOutputStream(f);
  • 只需在您的设备设置中检查您的应用程序的权限。 Android api 23 和最新版本会忽略您的清单权限。现在它需要用户交互来允许它。检查这个link

标签: android file-permissions fileoutputstream


【解决方案1】:

我想到了 3 件事要检查:

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

(1) 的来源是 answer,而 (3) 的来源是 answer

【讨论】:

  • 使用权限不在我的清单之外:&lt;manifest ... &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt; &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt; &lt;uses-permission android:name="android.permission.INTERNET"/&gt; &lt;application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Design"&gt;
  • 我不明白你是否解决了你的问题。我对第二个原因很有信心(权限会引发权限错误)
  • 我有问题。我看到fcImages 文件已创建
  • 当您尝试在另一个文件中创建文件时,会引发相同的 EACCESS。 fcImages 必须是目录
  • 必须请求运行时正确的 Android api 23 权限。
【解决方案2】:

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

示例 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> 

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2018-07-19
    • 2015-04-28
    • 2018-02-03
    • 2012-04-14
    • 2020-11-05
    相关资源
    最近更新 更多