2012-04-05 5 views
2

Я могу использовать некоторую помощь, чтобы понять, как открывать файлы в 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?

ответ

0

Вы все хорошо. У вас есть имя файла. Просто откройте его. Вот и все.

+0

Я редактировал вопрос, чтобы показать, что я только успешно с этим подходом, если файл находится на внешнем запоминающем устройстве. Иногда Uri указывает на внутреннее хранилище, и я не могу найти файл. –

8

Вы должны будете использовать contentResolver для доступа к внутренним файлам, передаваемым в качестве URI

ContentResolver cr = getContentResolver(); 
InputStream is = cr.openInputStream(imageUri); 
Смежные вопросы