Android 如何使用通用图像加载器显示视频缩略图

Android 如何使用通用图像加载器显示视频缩略图,android,thumbnails,universal-image-loader,Android,Thumbnails,Universal Image Loader,我需要显示视频缩略图使用通用图像加载器,任何帮助pleaz, 我可以从中获取缩略图位图 Bitmap b= ThumbnailUtils.createVideoThumbnail( "",MediaStore.Images.Thumbnails.MICRO_KIND); 但是如何在imageloader中显示它,因为如果我显示位图,适配器将使移动设备变慢,UIL接受视频的内容://Uri,并知道如何创建缩略图 例如,下面是一个ListFragment,它使用UIL提供

我需要显示视频缩略图使用通用图像加载器,任何帮助pleaz, 我可以从中获取缩略图位图

Bitmap b= ThumbnailUtils.createVideoThumbnail(
             "",MediaStore.Images.Thumbnails.MICRO_KIND);

但是如何在imageloader中显示它,因为如果我显示位图,适配器将使移动设备变慢,

UIL接受视频的
内容://
Uri,并知道如何创建缩略图

例如,下面是一个
ListFragment
,它使用UIL提供的缩略图显示视频列表:

/***
  Copyright (c) 2013 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain   a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
 */

package com.commonsware.android.video.list;

import android.app.Activity;
import android.app.LoaderManager;
import android.content.ContentUris;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

public class VideosFragment extends
    ContractListFragment<VideosFragment.Contract> implements
    LoaderManager.LoaderCallbacks<Cursor>,
    SimpleCursorAdapter.ViewBinder {
  private ImageLoader imageLoader;

  @Override
  public void onAttach(Activity host) {
    super.onAttach(host);

    ImageLoaderConfiguration ilConfig=
        new ImageLoaderConfiguration.Builder(getActivity()).build();

    imageLoader=ImageLoader.getInstance();
    imageLoader.init(ilConfig);
  }

  @Override
  public void onActivityCreated(Bundle state) {
    super.onActivityCreated(state);

    String[] from=
        { MediaStore.Video.Media.TITLE, MediaStore.Video.Media._ID };
    int[] to= { android.R.id.text1, R.id.thumbnail };
    SimpleCursorAdapter adapter=
        new SimpleCursorAdapter(getActivity(), R.layout.row, null,
                                from, to, 0);

    adapter.setViewBinder(this);
    setListAdapter(adapter);

    getLoaderManager().initLoader(0, null, this);
  }

  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    CursorAdapter adapter=(CursorAdapter)getListAdapter();
    Cursor c=(Cursor)adapter.getItem(position);
    int uriColumn=c.getColumnIndex(MediaStore.Video.Media.DATA);
    int mimeTypeColumn=
        c.getColumnIndex(MediaStore.Video.Media.MIME_TYPE);

    getContract().onVideoSelected(c.getString(uriColumn),
                                  c.getString(mimeTypeColumn));
  }

  @Override
  public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
    return(new CursorLoader(
                            getActivity(),
                            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                            null, null, null,
                            MediaStore.Video.Media.TITLE));
  }

  @Override
  public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
    ((CursorAdapter)getListAdapter()).swapCursor(c);
  }

  @Override
  public void onLoaderReset(Loader<Cursor> loader) {
    ((CursorAdapter)getListAdapter()).swapCursor(null);
  }

  @Override
  public boolean setViewValue(View v, Cursor c, int column) {
    if (column == c.getColumnIndex(MediaStore.Video.Media._ID)) {
      Uri video=
          ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
              c.getInt(column));
      DisplayImageOptions opts=new DisplayImageOptions.Builder()
          .showImageOnLoading(R.drawable.ic_media_video_poster)
          .build();

      imageLoader.displayImage(video.toString(), (ImageView)v, opts);

      return(true);
    }

    return(false);
  }

  interface Contract {
    void onVideoSelected(String uri, String mimeType);
  }
}
/***
版权所有(c)2013 Commonware,LLC
根据Apache许可证2.0版(以下简称“许可证”)获得许可;你不可以
除非符合许可证,否则请使用此文件。你可以得到一份
许可证的有效期在http://www.apache.org/licenses/LICENSE-2.0. 除非需要
根据适用法律或书面同意,根据
许可证按“原样”分发,无任何保证或条件
任何形式的,无论是明示的还是暗示的。请参阅许可证以了解具体的信息
管理许可证下的权限和限制的语言。
从《忙碌的程序员指南》到Android开发_
http://commonsware.com/Android
*/
包com.commonware.android.video.list;
导入android.app.Activity;
导入android.app.LoaderManager;
导入android.content.ContentUris;
导入android.content.CursorLoader;
导入android.content.Loader;
导入android.database.Cursor;
导入android.net.Uri;
导入android.os.Bundle;
导入android.provider.MediaStore;
导入android.view.view;
导入android.widget.CursorAdapter;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.SimpleCursorAdapter;
导入com.nostra13.universalimageloader.core.DisplayImageOptions;
导入com.nostra13.universalimageloader.core.ImageLoader;
导入com.nostra13.universialimageloader.core.imageloader配置;
公共类VideosFragment扩展
ContractListFragment实现
LoaderManager.LoaderCallbacks,
SimpleCursorAdapter.ViewBinder{
私有图像加载器;
@凌驾
公共活动主机(活动主机){
超级主机;
ImageLoaderConfiguration ilConfig=
新建ImageLoaderConfiguration.Builder(getActivity()).build();
imageLoader=imageLoader.getInstance();
init(ilConfig);
}
@凌驾
已创建ActivityCreated上的公共无效(捆绑状态){
super.onActivityCreated(state);
字符串[]来自=
{MediaStore.Video.Media.TITLE,MediaStore.Video.Media.\u ID};
int[]to={android.R.id.text1,R.id.thumbnail};
SimpleCorsorAdapter适配器=
新的SimpleCursorAdapter(getActivity(),R.layout.row,null,
从,到,0);
adapter.setViewBinder(这个);
setListAdapter(适配器);
getLoaderManager().initLoader(0,null,this);
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
CursorAdapter=(CursorAdapter)getListAdapter();
游标c=(游标)适配器.getItem(位置);
int-uriColumn=c.getColumnIndex(MediaStore.Video.Media.DATA);
int mimetype列=
c、 getColumnIndex(MediaStore.Video.Media.MIME_类型);
getContract().onVideoSelected(c.getString(uriColumn)),
c、 getString(mimeTypeColumn));
}
@凌驾
公共加载器onCreateLoader(int arg0,Bundle arg1){
返回(新游标装入器)(
getActivity(),
MediaStore.Video.Media.EXTERNAL\u CONTENT\u URI,
空,空,空,
MediaStore.Video.Media.TITLE);
}
@凌驾
public void onLoadFinished(加载器,光标c){
((CursorAdapter)getListAdapter()).swapCursor(c);
}
@凌驾
公共void onLoaderReset(加载器){
((CursorAdapter)getListAdapter()).swapCursor(null);
}
@凌驾
公共布尔值setViewValue(视图v、光标c、int列){
if(column==c.getColumnIndex(MediaStore.Video.Media.\u ID)){
Uri视频=
ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL\u CONTENT\u URI,
c、 getInt(列);
DisplayImageOptions opts=新建DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic\媒体\视频\海报)
.build();
imageLoader.displayImage(video.toString(),(ImageView)v,opts);
返回(真);
}
返回(假);
}
接口合同{
void onVideoSelected(字符串uri、字符串mimeType);
}
}
(来自)

setViewValue()
中,我获取视频ID,通过
ContentUris.withAppendedId()
组装相关视频
内容://
,并将其与UIL一起使用。

您有两种方法:

A:使用简单方法设置适配器

  • 请使用方法setImageBitmap()在图像中设置位图
  • 如果要在通用图像下载程序中设置位图
  • 在通用类中创建一个方法

    public void setImageThumbnail(String videoPath, ImageView imgView) {
    
       Bitmap b=ThumbnailUtils.createVideoThumbnail(videoPath,MediaStore.Images.Thumbnails.MICRO_KIND);
       imgView.setImageBitmap(b);
    
    }
    
  • 在需要的地方使用此方法

  • B:您也可以将Lru缓存用于适配器。

  • 使用工作线程加载位图
  • 创建lru缓存哈希映射以存储位图
  • 例如,请使用以下代码:
  • 有关更多详细信息,请使用以下链接:


    这将对您有所帮助。

    不,我不需要“setImageBitmap”,因为我在适配器中工作,因此使用位图的工作会使移动速度非常慢,我需要使用ImageLoader中的uri加载缩略图再次检查我的答案。是的,请在“B”部分解释更多您的答案,如何将位图加载到我的任务中imageview@mostafa哈希姆请检查示例链接。这可以解释你的怀疑。