在 Android 中创建 CSV 文件 11 Return 错误 "java.io.FileNotFoundException: EPERM (Operation not permitted)"

Creating a CSV file in Android 11 Return Error "java.io.FileNotFoundException: EPERM (Operation not permitted)"

您好,我正在尝试在我的 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 零件程序时 return a

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

我真的很难解决 android 11

设备的问题

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

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>

更多参考:

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

您的文件名中包含禁用字符。

不允许:

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