簡體   English   中英

在 Android 中創建 CSV 文件 11 返回錯誤“java.io.FileNotFoundException: EPERM (Operation not allowed)”

[英]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 零件程序時返回

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

我真的很難用 android 11 解決我的問題

“dd-MM-yyyy HH:mm:ss”

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

:不允許。

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

我相信這是一個權限問題。 為了寫入文件,您需要允許它。 以下是代碼示例:

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

我在我的“SFTP Server s0 v1”應用程序中有類似的行為,文件名和目錄名中允許的字符的問題與底層文件系統有關 - 請參閱文件系統比較 您可以通過調用adb shell mount來檢查哪個文件系統掛載到哪個目錄。 例如,在您的應用程序主目錄中創建一個文件(例如/data/data/ch.becke.sftp_server__s0_v1/files )是沒有問題的,因為/data目錄安裝為ext4/dev/block/dm-5 on /data type ext4... ),它允許文件名中的幾乎所有字符。 而外部存儲目錄(例如/storage/emulated/0/storage/140E-3C1A )安裝為vfatfuse ,它只允許文件名中包含有限的字符集。 (在我的應用程序中,我也支持使用范圍存儲管理文件,但我個人認為這更糟糕,因為它會自動將所有特殊字符替換為下划線字符_ )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM