Android ENOENT 一些文件
Android ENOENT with some files
我使用 Intent 获取图片路径并将它们打开到文件中。我可以打开分配在 "Camera" 文件夹中的文件,例如“/storage/emulated/0/DCIM/Camera/IMG_20160817_232858.jpg”,但我无法打开位于“/storage/emulated/0/Pictures/1634894_.png”等位置的文件。使用 file.exists() 它只是说它没有。
需要说明的是,我正在使用 API 23 并且我请求 READ_EXTERNAL_STORAGE,所以这应该不是问题......但即使这样我也无法访问这些文件。
有什么问题吗?
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
File file = new File(picturePath);
if(file.exists()) {
} else {
}
cursor.close();
}
}
更新:同一文件夹中的所有文件不会发生这种情况,只是其中一些,但它们确实存在,因为我可以从图库中打开它们。
更新2:
我用这个 Intent.
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
更新3:
运行 时间权限:
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
SomeWork();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
}
else {
SomeWork();
}
清单中的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
MediaStore
将为您无法从文件系统访问的图像编制索引。 DATA
列不需要 return 您可以使用的值。
相反,停止尝试获得 File
,并且 use the Uri
itself:
getContentResolver().openInputStream()
得到 InputStream
DocumentFile.fromSingleUri()
获取 DocumentFile
以便轻松访问元数据(例如 MIME 类型)
try{
// this works!!!
File csvfile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/brcOrdersaved.csv");
final String filename = csvfile.toString();
if (!csvfile.exists()) {
// displayMsg(context, "No Saved Order: ");
return (false);
}
FileReader fr = new FileReader(filename);
BufferedReader reader = new BufferedReader(fr);
String csvLine = "";
final char Separator = ',';
final char Delimiter = '"';
final char LF = '\n';
final char CR = '\r';
boolean quote_open = false;
if (reader.equals(null)) {
displayMsg(context, "NULL");
return (false);//rww 11/13/2021
}
int i = 0;
while (!myendofcsvfile) {
csvLine = reader.readLine();
if (csvLine == null) {
myendofcsvfile = true;
}
// do stuff here
}
fr.close();
fileexists = true;
} catch (Exception e) {
String msg = "Can not Load Saved Order ";
fileexists = false;
return (fileexists);
}
我使用 Intent 获取图片路径并将它们打开到文件中。我可以打开分配在 "Camera" 文件夹中的文件,例如“/storage/emulated/0/DCIM/Camera/IMG_20160817_232858.jpg”,但我无法打开位于“/storage/emulated/0/Pictures/1634894_.png”等位置的文件。使用 file.exists() 它只是说它没有。 需要说明的是,我正在使用 API 23 并且我请求 READ_EXTERNAL_STORAGE,所以这应该不是问题......但即使这样我也无法访问这些文件。 有什么问题吗?
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
File file = new File(picturePath);
if(file.exists()) {
} else {
}
cursor.close();
}
}
更新:同一文件夹中的所有文件不会发生这种情况,只是其中一些,但它们确实存在,因为我可以从图库中打开它们。
更新2: 我用这个 Intent.
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
更新3: 运行 时间权限:
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
SomeWork();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
}
else {
SomeWork();
}
清单中的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
MediaStore
将为您无法从文件系统访问的图像编制索引。 DATA
列不需要 return 您可以使用的值。
相反,停止尝试获得 File
,并且 use the Uri
itself:
getContentResolver().openInputStream()
得到InputStream
DocumentFile.fromSingleUri()
获取DocumentFile
以便轻松访问元数据(例如 MIME 类型)
try{
// this works!!!
File csvfile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/brcOrdersaved.csv");
final String filename = csvfile.toString();
if (!csvfile.exists()) {
// displayMsg(context, "No Saved Order: ");
return (false);
}
FileReader fr = new FileReader(filename);
BufferedReader reader = new BufferedReader(fr);
String csvLine = "";
final char Separator = ',';
final char Delimiter = '"';
final char LF = '\n';
final char CR = '\r';
boolean quote_open = false;
if (reader.equals(null)) {
displayMsg(context, "NULL");
return (false);//rww 11/13/2021
}
int i = 0;
while (!myendofcsvfile) {
csvLine = reader.readLine();
if (csvLine == null) {
myendofcsvfile = true;
}
// do stuff here
}
fr.close();
fileexists = true;
} catch (Exception e) {
String msg = "Can not Load Saved Order ";
fileexists = false;
return (fileexists);
}