【问题标题】:java.io.IOException: Permission denied cannot create filejava.io.IOException:权限被拒绝无法创建文件
【发布时间】:2021-08-17 00:21:39
【问题描述】:

我按照这个tutorial拍照并保存到设备存储中,但是当我执行它时,它得到了一个异常

java.io.IOException: Permission denied 
 on line:

File image = File.createTempFile(imageFileName, ".jpg", storageDir);

如何解决?

private File createImageFile() throws IOException
{
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "Camera");
    File image = File.createTempFile(imageFileName, ".jpg", storageDir);

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    return image;
}

--编辑--
这是我的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.idea.takephoto">

<uses-feature android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--<uses-feature android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->

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

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
</application>

【问题讨论】:

  • 请在 manfest 中声明此权限:android.permission.WRITE_EXTERNAL_STORAGE

标签: android


【解决方案1】:

Android Documentation一样,需要写入外部存储,必须在manifest file申请WRITE_EXTERNAL_STORAGE权限:

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

如果您使用 API 23 (Marshmallow) 及更高版本,则需要 Requesting Permissions at Run Time,因为它是 Dangerous Permission

【讨论】:

  • 我的所有问题都是需要请求权限。谢谢
  • 谢谢!这解决了我的问题
【解决方案2】:

如果您的目标 api 级别 >=29 或者您使用的是 android 10,请在应用程序标签中的应用清单文件中添加以下行

android:requestLegacyExternalStorage="true"

【讨论】:

  • 您的答案完全正确。谢谢
【解决方案3】:

将权限放入清单文件:

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

并在try catch 块中添加createTempFile 代码:

    File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File file = null;
    try {
        file = File.createTempFile(timeStamp, ".jpg", storageDir);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mCurrentPhotoPath = String.valueOf(Uri.fromFile(file));
    return file;

【讨论】:

    【解决方案4】:

    在清单文件中添加权限

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

    如果是above API 23 Storage permission will do like this

    【讨论】:

      【解决方案5】:

      在你的项目清单文件中写入这个标签,并在你运行它之前授予你的应用程序在你的安卓手机中设置的权限。

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

      【讨论】:

        【解决方案6】:

        我在使用 android 10 api 29 的设备时遇到了同样的问题。我可以通过将 Environment.getExternalStoragePublicDirectory 替换为 context.getExternalFilesDir 来解决它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-10
          • 1970-01-01
          • 2012-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多