Подтвердить что ты не робот

Как я могу проверить, что URI изображения действителен в Android?

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

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

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

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

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

EDIT 20110812.0044

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

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

В то время как контакты google теперь получают мое изображение "без изображения"... так что все остальные контакты, в том числе те, что делают, фактически имеют изображения.

4b9b3361

Ответ 1

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

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

Вот мой последний код:

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

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

Ответ 2

Просто, чтобы ответить на вопрос о том, как проверить значение (данных) в 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 
}

Вдохновение взято из fooobar.com/questions/432870/... и других.

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

Ответ 3

Возможно, изображения не загружены. Я столкнулся с аналогичной проблемой с изображениями 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"

Ответ 4

На основе кода (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;
}

Ответ 5

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

Uri resimUri = Uri.parse(path_str);
File imgFile = new File(resimUri.getPath());
if (imgFile.exists()) {
    // file exists
}else {
    // file is not there
}