【问题标题】:Creating a CSV file in Android 11 Return Error "java.io.FileNotFoundException: EPERM (Operation not permitted)"在 Android 11 中创建 CSV 文件返回错误“java.io.FileNotFoundException: EPERM (Operation not allowed)”
【发布时间】:2021-03-10 03:32:38
【问题描述】:

您好,我正在尝试在我的 android 应用程序中创建一个 csv 文件。当我尝试在下面的 android 10 上运行它时,我的代码有效。但我似乎找不到问题,为什么我不能在已经是 Android 11 的设备上执行此操作。

这是我的清单权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<application
        ...
        android:requestLegacyExternalStorage="true">

这是我在下载文件夹中创建文件夹的代码

@NonNull
public static File getStorageDirectory() {
    if (Environment.getExternalStorageState() == null) {

        File f = new File(Environment.getDataDirectory().getAbsolutePath() + "/Download/(Project Name)/");

        if(!f.exists())
            f.mkdirs();
        return f;
    } else {
        File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/(Project Name)/");
        if(!f.exists())
            f.mkdirs();
        return f;
    }
}

这是我如何创建 csv 文件的代码

File baseDir = Utility.getStorageDirectory();
String fileName = pollutant.getStationName();
String date = Utility.convertDate(new Date().getTime(), "dd-MM-yyyy HH:mm:ss");
File csvFile = new File(baseDir, fileName + "(1hr - "+pollutant.getPollutantName()+")(" + date + ").csv");

FileWriter writer;
if(csvFile.exists() && !csvFile.isDirectory()) {
    writer = new FileWriter(csvFile , true);
} else {
    writer = new FileWriter(csvFile);
}

我已经在 android 11 的下载文件夹中创建了一个文件夹,问题是当我尝试创建 csv 部分程序时返回一个

java.io.FileNotFoundException: ... open failed: EPERM (Operation not permitted)

我真的很难解决带有 android 11 的设备的问题

【问题讨论】:

  • 这是一个熟悉的问题,你有没有为文件写入权限代码?
  • 长按你的应用,点击```info``去应用权限你会明白我的意思
  • 我有存储权限。
  • 确定,请稍等
  • 这应该可以工作了。

标签: android csv android-11


【解决方案1】:

"dd-MM-yyyy HH:mm:ss"

您的文件名中有一个禁止字符。

不允许使用:

改成"dd-MM-yyyy HH.mm.ss"左右。

【讨论】:

    【解决方案2】:

    我认为这是一个权限问题。为了写入文件,您需要允许它。 以下是代码示例:

    public void onPermission() 
    {
    // Permision can add more at your convinient
        if ((ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) !=
            PackageManager.PERMISSION_GRANTED) 
             {
            ActivityCompat.requestPermissions(
                this,
                new String[] 
                {
                    Manifest.permission.READ_CONTACTS,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.BLUETOOTH,
                        Manifest.permission.CAMERA,
                        Manifest.permission.CALL_PHONE
                },
                0
            );
        }
    }
    

    用法:

    onPermission();onStart()onAcitivty()

    您也可以使用库,

    参考:https://github.com/Karumi/Dexter


    对于外部存储: 在应用标签内的应用的 AndroidManifest.xml 文件中添加属性:

    android:requestLegacyExternalStorage="true"

    例如。

    <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/AppTheme"
            android:requestLegacyExternalStorage="true">
    ...
    </application>
    

    更多参考:https://stackoverflow.com/a/61406983/10758321

    【讨论】:

    • 我试图在我的 onActivity 部分实现这一点。它仍然返回相同的错误。
    • 我已经更新了我的答案,如果有帮助请告诉我!
    • 是的,我的清单文件中已经有了 android:requestLegacyExternalStorage="true"。它仍然返回相同的错误。
    • 你清理过项目吗?
    • 是的,我有。我真的无法弄清楚我的项目中缺少什么才能在 Android 11 中运行它在下面的 Android 10 中运行良好....
    猜你喜欢
    • 2021-12-04
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多