2015-12-04 3 views
0

Я хочу установить изображение для ImageView на основе фотографии контакта, который я выбираю из списка контактов. После запуска в appriopriate намерения, в OnActivityResult я вызываю метод setImageURI() следующим образом:Android, изображение с URI

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

     if(requestCode==SHOW_CONTACTS_REQUEST_CODE){ 
      if(resultCode==RESULT_OK){ 
       Log.d("Selection",data.toString()); 
       contactImage.setImageURI(getImageUri(data.getData())); 
      } 
     } 
    } 

Вот getImageUri() метод:

private Uri getImageURI(Uri uri) { 
     Uri uriToPhoto=null; 
     ContentResolver contentResolver = getContentResolver(); 
     Cursor cursor= contentResolver.query(uri, new String[]{ContactsContract.Contacts.PHOTO_URI}, null, null, null); 
     if(cursor.moveToFirst()){ 
      uriToPhoto = Uri.parse(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI))); 
     } 
     cursor.close(); 
     return uriToPhoto; 
    } 

Этот метод дает Ури так: enter image description here

Проблема что фотография не установлена. Я пробовал некоторые трюки, ранее вызывая settingImageURI с нулевым параметром или недействительным contactImage после вызова метода, как это предлагается в разных потоках, но это не сработает.

Любая помощь будет оценена по достоинству.

+0

'setImageURI()' имеет другие проблемы, особенно выполнение ввода/вывода ContentProvider в главном потоке приложения. Я бы использовал библиотеку загрузки изображений, такую ​​как Picasso или Universal Image Loader, передав им значение «PHOTO_URI» и «ImageView», и позволяя им асинхронно заполнять «ImageView», используя образ-заполнитель. – CommonsWare

+0

Попробуйте преобразовать Uri, который вы получите в путь к файлу, и перейдите к пути, чтобы увидеть, существует ли изображение. или использовать новый файл (uri.getAbosolutePath), чтобы судить. –

+0

@tinysunlight Нет такого метода, как getAbsolutePath. Я могу использовать только getPath(), который возвращает строку, но как я могу «перейти на путь», чтобы увидеть, существует ли она? –

ответ

0

Ответ на этот вопрос не совсем прост. На самом деле в коде не было ничего плохого. Он начал работать после перехода с API 23 на API 21 и изменения моего последнего эмулятора.

Тогда, я думаю, это должно было быть что-то с этими новыми разрешениями в Зефир.

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