Android ENOENT с некоторыми файлами
Я использую Намерение, чтобы получить путь к изображениям и открыть их в файл. Я могу открыть файлы, расположенные в папке "Камера", например "/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();
}
}
Обновлено: это происходит не со всеми файлами в одной папке, только с некоторыми из них, но они действительно существуют, так как я могу открыть их из галереи.
Update2: я использую это намерение.
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" />
2 ответа
MediaStore
будет индексировать изображения, которые вам недоступны из файловой системы. Там нет никаких требований для DATA
столбец, чтобы вернуть значение, которое вы можете использовать.
Вместо этого перестаньте пытаться получить File
и использовать Uri
сам:
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);
}