2014-12-18 3 views
1

Я пытаюсь загрузить изображение в своей деятельности из DCIM. Я использую следующий код:Странное поведение при попытке получить изображение из DCIM

int BROWSE_PICTURES = 0; 
public void openBrowsePictures() { 
    Intent i = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

    startActivityForResult(i, BROWSE_PICTURES); 
} 

и в onActivityResult:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == BROWSE_PICTURES && resultCode == RESULT_OK && null != data) { // we have bitmap from filesystem! 
     Uri selectedImage = data.getData(); 
     Log.d("CAMERA","____"+selectedImage.toString()); 


     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 



     Cursor cursor = getContentResolver().query(
       selectedImage, filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     Log.d("CAMERA", " column : " + columnIndex); 
     String filePath = cursor.getString(columnIndex); 
     cursor.close(); 


     Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath); 


     Log.d("CAMERA", "----" + filePath); 
    } 
} 

Ситуация становится странно, когда я пытаюсь загрузить сфотографировались из файловой системы. Он работает как и ожидалось, когда a. Я выбираю картинку из файла EasyScreenshot, но когда b. Я выбираю картинку из DCIM/Camera path, она не работает. Если я запустил код Log.d на a. случай печатает:

КАМЕРЫ: ____content: // медиа/внешний/изображений/медиа/27487

и второй Log.d:

КАМЕРЫ: ----/хранение/эмулировать/0/Фотографии/Скриншоты/Screenshot_2014-12-18-15-14-22.png

, но, в случае, если б он печатает следующее:

первый log.d:

КАМЕРЫ: ____content: //com.google.android.apps.photos.content/0/https%3A%2F%2Flh5.googleusercontent.com%2F7tUacBA_4oYS2Q8CmkINWHa93B_n7heNyt3OyVZgkY8%3Ds0 -d

и второй log.d:

КАМЕРЫ: ---- нуль

Я протестировать приложение на устройстве Nexus 4 работает Android 5.0.1

Спасибо заранее

ответ

6

Вы не можете предположить, что Uri, возвращенный сборщик СМИ будет соответствовать локальному файлу. Похоже, вы выбираете фотографию G + или другое изображение, которое отсутствует в устройстве.

Правильный способ пойти должен был бы использовать ContentResolver для доступа к изображению в виде потока. Например:

InputStream inputStream = null; 
if (ContentResolver.SCHEME_CONTENT.equals(selectedImage.getScheme())) { 
    inputStream = context.getContentResolver().openInputStream(selectedImage); 
} else if (ContentResolver.SCHEME_FILE.equals(selectedImage.getScheme())) { 
    inputStream = new FileInputStream(selectedImage.getPath()); 
} 

bitmap = BitmapFactory.decodeStream(inputStream); 

Это должно работать для обоих content:// или file:// URIs.

И (очень важно) не забудьте сделать это из фоновой нити (например, AsyncTask), в противном случае вы получите NetworkOnMainThreadException, если uri является «удаленным».

+0

В чем разница между этими двумя переменными, которые вы использовали «selectedImage» и «mediaUri»? Благодарю. – issathink

+0

@issathink На самом деле я отредактировал свой код, чтобы соответствовать именам переменных OP, но пропустил одно использование. Спасибо, что указали это. – matiash

+0

Не могу поверить, что это не указано нигде в документах или образцах ... – RominaV

2

Вы должны обрабатывать содержание: //com.google.android.apps.photos.content типа URL с поставщиком контента, как вы уже. Однако вы должны попробовать сделать это таким образом, пропустив реальный путь к файлу и просто получив растровое изображение.

https://stackoverflow.com/a/19835603/4380308

+0

Я переключился на INTERNAL_CONTENT_URI, как вы упомянули, но имеет точно такое же поведение. – karvoynistas

 Смежные вопросы

  • Нет связанных вопросов^_^