Saturday, 31 August 2013

UniversalImageLoader Does not load images from ContentProvider

UniversalImageLoader Does not load images from ContentProvider

my problem is this: I have a ListView in which i want to show song data. I
actually get the data from MediaStore. In the ListView items, i have an
ImageView in which i want to set the album art. I tried to use
UniversalImageLoader :
https://github.com/nostra13/Android-Universal-Image-Loader But images are
not loaded, i see only the "show-on-fail" image. on UniversalImageLoader's
page there is a section where an image path like :
"content://media/external/audio/albumart/243" is allowed.
This is my list adapter java class:
public class SongsAdapter extends BaseAdapter implements Filterable
{
public Context _c;
public ArrayList<Song> _data;
public ArrayList<Song> _originalData;
public SongFilter songFilter;
public ImageLoader imageLoader;
ImageLoaderConfiguration config;
public DisplayImageOptions options;
public ImageLoadingListener animateFirstListener;
public SongsAdapter(ArrayList<Song> _data, Context _c)
{
this._c = _c;
this._data = _data;
this._originalData = _data;
config = new ImageLoaderConfiguration.Builder(this._c)
.imageDownloader(new BaseImageDownloader(this._c))
.imageDecoder(new BaseImageDecoder(true))
.build();
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.song_art_w)
.showImageOnFail(R.drawable.song_art)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.ARGB_8888)
.build();
imageLoader = ImageLoader.getInstance();
imageLoader.init(config);
animateFirstListener = new AnimateFirstDisplayListener();
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null)
convertView =
((LayoutInflater)_c.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.list_item_song,
null);
Song s = _data.get(position);
ImageView songArt =
(ImageView)convertView.findViewById(R.id.song_art);
TextView songTitle =
(TextView)convertView.findViewById(R.id.song_title);
TextView songArtist =
(TextView)convertView.findViewById(R.id.song_artist);
TextView songAlbum =
(TextView)convertView.findViewById(R.id.song_album);
imageLoader.displayImage(BitmapUtils.getString(s.album_id),
songArt, options, animateFirstListener);
songTitle.setText(s.title.toUpperCase());
songTitle.setTypeface(Configuration.TEXT_BLACK);
songTitle.setSingleLine(true);
songArtist.setText(s.artist);
songArtist.setTypeface(Configuration.TEXT_REGULAR);
songArtist.setSingleLine(true);
songAlbum.setText(s.album);
songAlbum.setTypeface(Configuration.TEXT_REGULAR);
songAlbum.setSingleLine(true);
return convertView;
}
@Override
public int getCount()
{
return _data.size();
}
@Override
public Object getItem(int position)
{
return _data.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public Filter getFilter()
{
if (songFilter == null)
songFilter = new SongFilter();
return songFilter;
}
private class SongFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final ArrayList<Song> list = _originalData;
int count = list.size();
final ArrayList<Song> nlist = new ArrayList<Song>(count);
Song s;
for (int i = 0; i < count; i++)
{
s = list.get(i);
if(s.title.toLowerCase().contains(filterString))
{
nlist.add(s);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results)
{
_data = (ArrayList<Song>)results.values;
notifyDataSetChanged();
}
}
private static class AnimateFirstDisplayListener extends
SimpleImageLoadingListener
{
static final List<String> displayedImages =
Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap
loadedImage)
{
if (loadedImage != null)
{
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if(firstDisplay)
{
FadeInBitmapDisplayer.animate(imageView, 500);
displayedImages.add(imageUri);
}
}
}
}
}
Next, this is my xml layout for the single listView item:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@drawable/icon_selector_gray"
android:clickable="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_centerInParent="true">
<ImageView
android:id="@+id/song_art"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="center"
android:scaleType="fitCenter"
android:gravity="center"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp"
android:background="@android:color/transparent"
android:contentDescription="@string/app_name">
</ImageView>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp">
<TextView
android:id="@+id/song_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="left|center_vertical"
android:background="@android:color/transparent"
android:padding="0dp"
android:textSize="16dp"
android:textColor="#ff2a2a2a">
</TextView>
<TextView
android:id="@+id/song_artist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="left|center_vertical"
android:background="@android:color/transparent"
android:padding="0dp"
android:textSize="12dp"
android:textColor="#ff2a2a2a">
</TextView>
<TextView
android:id="@+id/song_album"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="left|center_vertical"
android:background="@android:color/transparent"
android:padding="0dp"
android:textSize="12dp"
android:textColor="#ff2a2a2a">
</TextView>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
Finally, my app does not crash, but i got these exceptions (i would paste
one here, but for each song image art to load i got one exception same as
this)
No entry for content://media/external/audio/albumart/243
java.io.FileNotFoundException: No entry for
content://media/external/audio/albumart/243
at
android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:144)
at
android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:612)
at
android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:607)
at
android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:536)
at android.content.ContentResolver.openInputStream(ContentResolver.java:371)
at
com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromContent(BaseImageDownloader.java:157)
at
com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:80)
at
com.nostra13.universalimageloader.core.decode.BaseImageDecoder.getImageStream(BaseImageDecoder.java:81)
at
com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:68)
at
com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:305)
at
com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:260)
at
com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:129)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
The strange thing is that 1 hour ago my imageLoader were working fine... i
think i have moved/removed some code, because i can't recognize the error
anymore. Did someone has implemented this, or know where the problem is?
thanks in advance.

No comments:

Post a Comment