【问题标题】:java.io.FileNotFoundException: open failed: EACCES (Permission denied) for API >22java.io.FileNotFoundException:打开失败:API > 22 的 EACCES(权限被拒绝)
【发布时间】:2016-12-18 14:23:35
【问题描述】:

我会尽量简短。有一个应用程序在所有 API 级别 22 及以下设备上正常运行,但是对于 22 以上的新版本具有有关权限的规则的新实现,我在尝试获取文件时收到此错误消息,指出无法找到它,因为我没有'没有正确的权限。

自然,在询问之前,我做了一些谷歌搜索,发现人们通过将“uses-sdk”AndroidManifest 标记中的 targetSdkVersion 设置为 22 来解决这个问题。我这样做了,甚至在清单中添加了权限,但我仍然收到此错误。

这是整个清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.packagename.appname">

    <uses-sdk android:targetSdkVersion="22"></uses-sdk>

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

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.camera.any"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

那么这里的交易是什么?

我应该提到该应用程序在 API 22 设备上完美运行,并且我已经检查过,文件的路径是相同的,所以据我所知,这是一个权限问题。

【问题讨论】:

  • "将 'uses-sdk' AndroidManifest 标签中的 targetSdkVersion 设置为 22" -- 如果您使用 Android Studio 进行开发,通常targetSdkVersion 设置在模块的build.gradle 文件中(例如,app/build.gradle)。此外,Gradle 中的值会覆盖 &lt;uses-sdk&gt; 中的值。通常,我们在 manifest 中去掉 &lt;uses-sdk&gt; 并使用 Gradle 来处理 minSdkVersiontargetSdkVersion。确保您的 22 未被 Gradle 设置覆盖。
  • 你又来救我了。发现。像魅力一样工作。

标签: java android sdk


【解决方案1】:

从历史上看,targetSdkVersion 是通过 &lt;uses-sdk&gt; 元素设置的。

在基于 Gradle 的 Android 应用开发中,例如通过 Android Studio,targetSdkVersion 通常设置在模块的 build.gradle 文件中(例如,app/build.gradle)。 Gradle 中设置的值会覆盖清单中设置的值。

因此,将 &lt;uses-sdk&gt; 添加到清单中似乎没有任何效果,仅仅是因为 Gradle 覆盖了这些值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2015-08-06
    • 2021-05-16
    • 2013-07-06
    • 1970-01-01
    • 2016-10-15
    • 2021-05-15
    相关资源
    最近更新 更多