Как я могу проверить URI изображения в Android? - PullRequest
12 голосов
/ 12 августа 2011

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

Для контактов, у которых нет изображений, я показываю изображение без изображения. Это прекрасно работает для контактов в адресной книге телефона. Однако у меня проблема с изображениями из моих контактов в Google.

У большинства моих контактов в гугле нет фотографий. Однако, когда я запрашиваю базу данных контактов для фотографий, она все равно возвращает для них URI в форме content://com.android.contacts/contacts/657/photo (тот же формат, что и для контактов, у которых do есть фото.

Затем, когда я пытаюсь назначить фотографию для QuickContactBadge, используя bdg.setImageURI(pic);, он устанавливает ее практически как пустое изображение и регистрирует сообщение INFO в автоматическом режиме, в котором говорится:

INFO/System.out(3968): resolveUri failed on bad bitmap uri: 
content://com.android.contacts/contacts/657/photo

Мне нужно знать, как я могу
a) проверить URI или
b) перехватить сообщение INFO выше
c) запросить изображение / значок, чтобы увидеть, нашло ли оно правильное изображение

чтобы я мог назначить этим контактам свое изображение "без изображения".
Как я могу сделать это?

РЕДАКТИРОВАТЬ 20110812.0044

Я попытался добавить это к своему коду согласно предложению Лоуренса (которое он с тех пор удалил):

// rv is my URI variable
if(rv != null) {
    Drawable d = Drawable.createFromPath(rv.toString());
    if (d == null) rv = null;
}

Хотя контакты Google теперь получают мое изображение «без изображения», ... так же, как и все остальные контакты, включая те, которые делают на самом деле имеют изображения.

Ответы [ 5 ]

13 голосов
/ 15 августа 2011

Хорошо, я разобрался, как это сделать, после просмотра исходного кода ImageView. На самом деле он использует собственные методы QuickContactBadge, но при необходимости всегда можно извлечь соответствующий код из элемента управления Badge / ImageView здесь .

После установки изображения QCB я проверяю, является ли его ничья ничейным, вместо того, чтобы попробовать мое собственное (согласно предложению Лоуренса). Это работает лучше, потому что на самом деле есть целый набор проверяющего кода, который использует виджет ImageView.

Вот мой окончательный код:

bdg.setImageURI(pic);
if(bdg.getDrawable() == null) bdg.setImageResource(R.drawable.contactg);

Это прекрасно работает, как я надеялся и ожидал.

3 голосов
/ 02 мая 2013

Просто чтобы ответить на вопрос о том, как проверить значение (данных) в MediaStore:

ContentResolver cr = getContentResolver();
String[] projection = {MediaStore.MediaColumns.DATA}
Cursor cur = cr.query(Uri.parse(contentUri), projection, null, null, null);
if(cur != null) {
    cur.moveToFirst();
    String filePath = cur.getString(0);

    if (filePath == null || filePath.isEmpty()) {
        // data not set
    } else if((new File(filePath)).exists()){
        // do something if it exists
    } else {
        // File was not found
        // this is binary data
    }
} else {
    // content Uri was invalid or some other error occurred 
}

Вдохновение взято из: https://stackoverflow.com/a/7649784/621690 и др.

Существует также столбец SIZE, который можно проверить: http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#SIZE Похоже, он должен содержать 0, если нет значения данных. Но я бы не знал, что в нем содержится, если данные представляют собой путь к файлу.

2 голосов
/ 02 апреля 2016

Возможно, изображения не загружены.Я столкнулся с аналогичной проблемой с изображениями WhatsApp.Один из способов сделать это может быть следующим:

InputStream is = null;
try {
   is = context.getContentResolver().openInputStream(myuri);
}catch (Exception e){
   Log.d("TAG", "Exception " + e);
}

if(is==null)
    //Assign to "no image"
0 голосов
/ 14 января 2017

Я использую этот код для Uri, который имеет файл: // author

Uri resimUri = Uri.parse(path_str);
File imgFile = new File(resimUri.getPath());
if (imgFile.exists()) {
    // file exists
}else {
    // file is not there
}
0 голосов
/ 02 января 2015

На основе кода (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/ImageView.java) мое решение для проверки Uri:

public static Uri checkUriExists (Context  mContext,Uri mUri) {
    Drawable d = null;
    if (mUri != null) {
        if ("content".equals(mUri.getScheme())) {
            try {
                d = Drawable.createFromStream(
                        mContext.getContentResolver().openInputStream(mUri),
                        null);
            } catch (Exception e) {
                Log.w("checkUriExists", "Unable to open content: " + mUri, e);
                mUri = null;
            }
        } else {
            d = Drawable.createFromPath(mUri.toString());
        }

        if (d == null) {
            // Invalid uri
            mUri = null;
        }
    }

    return mUri;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...