java.io.FileNotFoundException:/storage/emulated/0/New file.txt:打开失败:EACCES(权限被拒绝)
java.io.FileNotFoundException: /storage/emulated/0/New file.txt: open failed: EACCES (Permission denied)
我一直在尝试加密文件并将这些文件写回到同一个地方。但是我收到错误消息 "java.io.FileNotFoundException: /storage/emulated/0/New file.txt: open failed: EACCES (Permission denied)".
我的Manifest
文件是这个
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tdk.mytestapplication2">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
我想我在那里提供了正确的许可。我用来加密文件的代码是这样的。
public static void encrypt(SecretKey secretKey, String filePath){
try {
// Here you read the cleartext.
FileInputStream fis = new FileInputStream(filePath);
// This stream write the encrypted text. This stream will be wrapped by another stream.
FileOutputStream fos = new FileOutputStream(filePath);
// Create cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// Wrap the output stream
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
// Write bytes
int b;
byte[] d = new byte[8];
while ((b = fis.read(d)) != -1) {
cos.write(d, 0, b);
}
// Flush and close streams.
cos.flush();
cos.close();
fis.close();
}catch(IOException e){
e.printStackTrace();
}catch (NoSuchAlgorithmException e){
e.printStackTrace();
}catch(NoSuchPaddingException e){
e.printStackTrace();
}catch(InvalidKeyException e){
e.printStackTrace();
}
}
我在按钮中使用了这个方法
Button btnEncrypt = (Button) findViewById(R.id.btnEnc);
btnEncrypt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
aesKey = EncAndDec.generateKey();
String filePath = editText.getText().toString();
//Generating the file hash
String md5Hash = MD5Hash.getMD5(filePath);
System.out.println(aesKey.toString());
System.out.println(filePath);
System.out.println(md5Hash);
//Encrypting the file
for(int i=1; i<100; i++) {
EncAndDec.encrypt(aesKey, filePath);
}
}
});
我仍然无法配置此错误。请有人帮忙!
我怀疑您是 运行 Android 6.0 Marshmallow (API 23) 或更高版本。如果是这种情况,您必须实施runtime permissions,然后再尝试read/write外部存储。
在 Android 6.0 Marshmallow (API 23) 或更高版本上为 运行 您的应用实施运行时权限。
或者您可以手动开启存储权限-
转到设置>应用程序> "your_app_name">点击它>然后点击权限>然后启用存储。就是这样。
但我建议您选择第一个,即在您的代码中实施运行时权限。
如果您 运行 在 Android 29,那么您必须使用分区存储,或者现在,您可以使用以下方法绕过此问题:
android:requestLegacyExternalStorage="true"
在应用程序标签中的清单中。
对于 SDK 29:
String str1 = "";
folder1 = new File(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)));
if (folder1.exists()) {str1 = folder1.toString() + File.separator;}
public static void createTextFile(String sBody, String FileName, String Where) {
try {
File gpxfile = new File(Where, FileName);
FileWriter writer = new FileWriter(gpxfile);
writer.append(sBody);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
然后你可以这样保存你的文件:
createTextFile("This is Content","file.txt",str1);
在 Android 11 日,应用程序无法再访问外部存储中任何其他应用程序专用的、特定于应用程序的目录中的文件。
为了保护用户隐私,在 运行 Android 11 或更高版本的设备上,系统进一步限制您的应用访问其他应用的私有目录。
请求MANAGE_EXTERNAL_STORAGE许可
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage"/>
请求外部存储权限
ActivityCompat.requestPermissions( this,
new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.MANAGE_EXTERNAL_STORAGE
}, 1
);
正在检查 MANAGE_EXTERNAL_STORAGE
的权限
// If you have access to the external storage, do whatever you need
if (Environment.isExternalStorageManager()){
// If you don't have access, launch a new activity to show the user the system's dialog
// to allow access to the external storage
}else{
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
我一直在尝试加密文件并将这些文件写回到同一个地方。但是我收到错误消息 "java.io.FileNotFoundException: /storage/emulated/0/New file.txt: open failed: EACCES (Permission denied)".
我的Manifest
文件是这个
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tdk.mytestapplication2">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
我想我在那里提供了正确的许可。我用来加密文件的代码是这样的。
public static void encrypt(SecretKey secretKey, String filePath){
try {
// Here you read the cleartext.
FileInputStream fis = new FileInputStream(filePath);
// This stream write the encrypted text. This stream will be wrapped by another stream.
FileOutputStream fos = new FileOutputStream(filePath);
// Create cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// Wrap the output stream
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
// Write bytes
int b;
byte[] d = new byte[8];
while ((b = fis.read(d)) != -1) {
cos.write(d, 0, b);
}
// Flush and close streams.
cos.flush();
cos.close();
fis.close();
}catch(IOException e){
e.printStackTrace();
}catch (NoSuchAlgorithmException e){
e.printStackTrace();
}catch(NoSuchPaddingException e){
e.printStackTrace();
}catch(InvalidKeyException e){
e.printStackTrace();
}
}
我在按钮中使用了这个方法
Button btnEncrypt = (Button) findViewById(R.id.btnEnc);
btnEncrypt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
aesKey = EncAndDec.generateKey();
String filePath = editText.getText().toString();
//Generating the file hash
String md5Hash = MD5Hash.getMD5(filePath);
System.out.println(aesKey.toString());
System.out.println(filePath);
System.out.println(md5Hash);
//Encrypting the file
for(int i=1; i<100; i++) {
EncAndDec.encrypt(aesKey, filePath);
}
}
});
我仍然无法配置此错误。请有人帮忙!
我怀疑您是 运行 Android 6.0 Marshmallow (API 23) 或更高版本。如果是这种情况,您必须实施runtime permissions,然后再尝试read/write外部存储。
在 Android 6.0 Marshmallow (API 23) 或更高版本上为 运行 您的应用实施运行时权限。
或者您可以手动开启存储权限-
转到设置>应用程序> "your_app_name">点击它>然后点击权限>然后启用存储。就是这样。
但我建议您选择第一个,即在您的代码中实施运行时权限。
如果您 运行 在 Android 29,那么您必须使用分区存储,或者现在,您可以使用以下方法绕过此问题:
android:requestLegacyExternalStorage="true"
在应用程序标签中的清单中。
对于 SDK 29:
String str1 = "";
folder1 = new File(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)));
if (folder1.exists()) {str1 = folder1.toString() + File.separator;}
public static void createTextFile(String sBody, String FileName, String Where) {
try {
File gpxfile = new File(Where, FileName);
FileWriter writer = new FileWriter(gpxfile);
writer.append(sBody);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
然后你可以这样保存你的文件:
createTextFile("This is Content","file.txt",str1);
在 Android 11 日,应用程序无法再访问外部存储中任何其他应用程序专用的、特定于应用程序的目录中的文件。 为了保护用户隐私,在 运行 Android 11 或更高版本的设备上,系统进一步限制您的应用访问其他应用的私有目录。
请求MANAGE_EXTERNAL_STORAGE许可
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage"/>
请求外部存储权限
ActivityCompat.requestPermissions( this,
new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.MANAGE_EXTERNAL_STORAGE
}, 1
);
正在检查 MANAGE_EXTERNAL_STORAGE
的权限// If you have access to the external storage, do whatever you need
if (Environment.isExternalStorageManager()){
// If you don't have access, launch a new activity to show the user the system's dialog
// to allow access to the external storage
}else{
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}