在 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"
左右。
您好,我正在尝试在我的 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"
左右。