Я могу использовать некоторую помощь, чтобы понять, как открывать файлы в android. Моя конкретная проблема связана с открытием файла изображения. В моем приложении пользователь берет изображение с выбранным приложением камеры, а затем я работаю над возвращаемым изображением. В зависимости от телефона, версии Android и выбранного приложения камеры, я получаю разные параметры, возвращаемые в onActivityResult. Иногда я получаю URI, иногда просто изображение, а иногда и то, и другое.Открыть файл от Uri, независимо от местоположения в android
Код для запуска камеры является:
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, CAMERA_IMAGE);
Затем я получить результат, как:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_IMAGE && resultCode == Activity.RESULT_OK) {
Log.d(TAG,"In onActivityResult");
Bitmap imageBmp = null;
Uri imageUri = data.getData();
if (data.getExtras() != null) {
imageBmp = (Bitmap)data.getExtras().get("data");
Log.d(TAG,"Got Bitmap");
}
...
}
}
Моя проблема возникает, когда я получаю URI, но не изображения. Если imageBmp имеет значение null, мне нужно загрузить изображение из URI. Я проверил это несколько комбинаций устройств/приложений. Иногда URI находится во внутреннем хранилище и в других случаях на SD-карте. Если файл находится на SD-карте, я использовал файл manageQuery для получения файла.
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(imageUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
imageFileName = cursor.getString(column_index);
File imageFile = new File(imageFileName);
...
Если это во внутреннем хранилище, я получаю исключение FileNotFoundException.
Мой конкретный вопрос: Как мне изменить это, чтобы открыть файл независимо от того, где он находится в файловой системе, только зная URI? Я хотел бы сделать что-то вроде:
File imageFile = new File(imageUri);
, но файл не принимает объект Uri. Я делаю управляемый запрос, чтобы преобразовать его в String.
Мой более общий вопрос, почему мне нужно выполнить запрос в первую очередь? Почему я не могу использовать возвращаемый URI?
Я редактировал вопрос, чтобы показать, что я только успешно с этим подходом, если файл находится на внешнем запоминающем устройстве. Иногда Uri указывает на внутреннее хранилище, и я не могу найти файл. –