**如何获取手机里存储的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();
}
上面只是简单的用法,不过即使这样应该也能满足各位看官的大部分需求了。