Android gif读取展示一波带走~

**如何获取手机里存储的GIF文件,我在网上查阅大多数资料都发现是教我遍历文件夹种种,但我个人非常不喜欢这种操作,第一,遍历毕竟是一个比较死板的方法,随着系统使用的越久,存储的文件越多,遍历的成本越大,效率越低。第二,加入需求是让你依据某个顺序将gif文件排序,比如文件大小,创建日期等,遍历出来再用冒泡或者二分法重新将你辛辛苦苦遍历出来的集合进行排序自然显得程序效率很低。
所以,数据库是解决这些问题的最好方法。直接上代码:**

public class MainActivity extends AppCompatActivity {
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = MainActivity.this;
setContentView(R.layout.activity_main);
getSupportLoaderManager().initLoader(1, null, mLoaderCallback);
}

public LoaderManager.LoaderCallbacks<Cursor> mLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        CursorLoader cursorLoader = new CursorLoader(mContext,
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
                 IMAGE_PROJECTION[3] + "=? ",
                new String[]{"image/gif"}, IMAGE_PROJECTION[2] + " DESC");
        return cursorLoader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        int count = data.getCount();
        data.moveToFirst();
        for(int i = 0 ; i< count ; i++){
            String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]));
            String display = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]));
            String date = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]));
            String type = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[3]));
            Log.e("test","path:  "+path);
            Log.e("test","display:  "+display);
            Log.e("test","date:  "+stampToDate(date));
            Log.e("test","type:  "+type);
            data.moveToNext();
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }

    private final String[] IMAGE_PROJECTION = {
            MediaStore.Images.Media.DATA,
            MediaStore.Images.Media.DISPLAY_NAME,
            MediaStore.Images.Media.DATE_TAKEN,
            MediaStore.Images.Media.MIME_TYPE,
            MediaStore.Images.Media.SIZE,
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.LATITUDE,
            MediaStore.Images.Media.LONGITUDE,
            MediaStore.Images.Media.DESCRIPTION
    };
};

/*
* 将时间戳转换为时间
*/
public static String stampToDate(String s){
    String res;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    long lt = new Long(s);
    Date date = new Date(lt);
    res = simpleDateFormat.format(date);
    return res;
}
}

代码很容易懂,以上例子只是想说一个思路,通过系统本身的多媒体数据库是能查询到gif文件的,而且通过LoaderManager.LoaderCallbacks的注册,你的程序能够监控到数据库的变化,你只需要在逻辑上处理好onLoadFinished()方法中对数据的处理就好。

然后,当然我们不满足于数据的获取,展示gif也是同样重要的部分。
这里我推荐一个开源的gif处理框架android-gif-drawable(https://github.com/koral–/android-gif-drawable)。当然找到这个之前,我当然先试过我心爱的Glide,但是很抱歉,gif显示作为Glide的一大特色确实还有所欠缺,OOM现象毕竟严重,这里当然不能怪Glide,GIF的确太容易OOM了。通过底层.so中所做的处理让展示GIf的表现的确强于其他途径。
GifDrawable gifFromFile = null;
try {
gifFromFile = new GifDrawable(new File(yourFilePath));
imageview.setImageDrawable(gifFromFile);
} catch (IOException e) {
e.printStackTrace();
}

上面只是简单的用法,不过即使这样应该也能满足各位看官的大部分需求了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值