Intereting Posts
Appcompat не работает Отправка Android-сообщения прикосновением к основной активности при отображении диалога Использование символа @ в файле strings.xml Как предоставить пространство между текстом в текстовом виде? Можно ли использовать Android Beam между устройством Android и другим устройством NFC? Изменить цвет фона Предпочтения Поддержка как ландшафтных ориентаций в Honeycomb Бирманская речь для преобразования текста в андроид? Идентификатор LinkedIn получает значение null для android JQuery Mobile / Phonegap на андроиде – весь текст отображается в шапках Обнаружение события касания кнопок навигации внутри службы, имеющей окно Как удалить текст заголовка из Android ActionBar? Язык ограниченного языка Android для проверки отсутствующих переводов Заполнение цвета в многоугольнике, а точки, пересекающиеся в Android Почему размер моего приложения на устройстве отличается от размера APK или Play Store

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

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

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

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

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

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

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

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

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

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

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

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