Android, изображение из URI

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

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;
    }

Этот метод создает Uri следующего вида:  введите описание изображения здесь

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

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


person Paweł Poręba    schedule 04.12.2015    source источник
comment
setImageURI() имеет другие проблемы, особенно с ContentProvider вводом-выводом в основном потоке приложения. Я бы использовал библиотеку загрузки изображений, такую ​​как Picasso или Universal Image Loader, передавая им значение PHOTO_URI и ImageView и позволяя им заполнять ImageView асинхронно, используя тем временем изображение-заполнитель.   -  person CommonsWare    schedule 04.12.2015
comment
Попробуйте преобразовать полученный Uri в путь к файлу и перейти к нему, чтобы увидеть, существует ли изображение. или используйте новый файл (uri.getAbosolutePath) для оценки.   -  person tiny sunlight    schedule 04.12.2015
comment
@tinysunlight Нет такого метода, как getAbsolutePath. Я могу использовать только getPath (), который возвращает строку, но как я могу перейти по пути, чтобы узнать, существует ли он?   -  person Paweł Poręba    schedule 04.12.2015
comment
это путь. просто зайдите в проводник в телефоне и укажите путь.   -  person tiny sunlight    schedule 05.12.2015


Ответы (1)


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

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

person Paweł Poręba    schedule 05.12.2015