1 、图片数据库都有哪些字段
【_data】 /storage/emulated/0/baidu/searchbox/downloads/u_869433472_2689249404&fm_58.jpeg 【_size】 12090 【_display_name】 u_869433472_2689249404&fm_58.jpeg 【mime_type】 image/jpeg 【title】 u_869433472_2689249404&fm_58 【date_added】 1544686063 【date_modified】 1544686063 【description】 null 【picasa_id】 null 【isprivate】 null 【latitude】 null 【longitude】 null 【datetaken】 1544686063000 【orientation】 0 【mini_thumb_magic】 -5953928993949684524 【bucket_id】 1775061873 【bucket_display_name】 downloads 【width】 240 【parent】 32 【camera_refocus】 0
怎么来的?
/** * * @param ctx * @param uri * 图片内容URI: MediaStore.Images.Media.EXTERNAL_CONTENT_URI * 音频内容URI: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI * 视频内容URI: MediaStore.Video.Media.EXTERNAL_CONTENT_URI * @return 所有图片的list,map是每个图片在数据库中的列信息 */ public static List<Map> getMediaImageInfo(Context ctx, Uri uri) { //可以手动指定获取的列 String[] columns = new String[]{ MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID, MediaStore.Images.Media.TITLE, MediaStore.Images.Media.DISPLAY_NAME , MediaStore.Images.Media.LATITUDE, MediaStore.Images.Media.LONGITUDE, MediaStore.Images.Media.DATE_TAKEN}; ContentResolver contentResolver = ctx.getContentResolver(); // Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;//外部存储的SD卡的访问Uri,image表示访问图片 Cursor cursor = contentResolver.query(uri, null, null, null, null);//获取全部列 // Cursor cursor = contentResolver.query(uri, columns, null, null, null);//获取指定列 if (cursor != null) { Map<String, String> item = null; List<Map> result = new ArrayList<>(); while (cursor.moveToNext()) { String[] columnNames = cursor.getColumnNames(); item = new HashMap<>(); for (String colnmnName : columnNames) { int columnIndex = cursor.getColumnIndex(colnmnName); String columnValue = cursor.getString(columnIndex); item.put(colnmnName, columnValue); System.out.println("【"+colnmnName+"】"+" "+columnValue); } result.add(item); } return result; } return null; }
2、监测图库更新
原理很简单,自定义一个类继承ContentObserver,重写onChange()方法
public class ScreenshotContentObserver extends ContentObserver { public ScreenshotContentObserver(Context context, Handler handler) { super(handler); } /** * Creates a content observer. * * @param handler The handler to run {@link #onChange} on, or null if none. */ public ScreenshotContentObserver(Handler handler) { super(handler); } /** * 主要在onChange中响应数据库变化,并进行相应处理 */ @Override public void onChange(boolean selfChange) { super.onChange(selfChange); } }
调用的地方很关键:
private void registerContentObserver() { mScreenObserver = new ScreenshotContentObserver(MainActivity.this, mHandler); registerContentObserver(); /*之前说过,非常关键的Uri*/ Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; getContentResolver().registerContentObserver(imageUri, false, mScreenObserver); }
在registerContentObserver()方法里,传入什么Uri,就会监听什么数据库的变化,常用的几种Uri在上面已经有所提及。
3.获取最新的一张图片及该图片的一些信息
方法一:
package com.example.suyang07.getlastpicdemo;import android.database.Cursor;import android.os.Bundle;import android.provider.MediaStore;import android.support.v4.app.FragmentActivity;import android.support.v4.app.LoaderManager;import android.support.v4.content.CursorLoader;import android.support.v4.content.Loader;public class ImageDataSource implements LoaderManager.LoaderCallbacks<Cursor> { public static final int LOADER_ALL = 0; //加载所有图片 public static final int LOADER_CATEGORY = 1; //分类加载图片 private final String[] IMAGE_PROJECTION = { //查询图片需要的数据列 MediaStore.Images.Media.DISPLAY_NAME, //图片的显示名称 aaa.jpg MediaStore.Images.Media.DATA, //图片的真实路径 /storage/emulated/0/pp/downloader/wallpaper/aaa.jpg MediaStore.Images.Media.SIZE, //图片的大小,long型 132492 MediaStore.Images.Media.WIDTH, //图片的宽度,int型 1920 MediaStore.Images.Media.HEIGHT, //图片的高度,int型 1080 MediaStore.Images.Media.MIME_TYPE, //图片的类型 image/jpeg MediaStore.Images.Media.DATE_ADDED //图片被添加的时间,long型 1450518608 }; private FragmentActivity activity; /** * 图片加载完成的回调接口 */ private OnImagesLoadedListener loadedListener; /** * @param activity 用于初始化LoaderManager,需要兼容到2.3 * @param path 指定扫描的文件夹目录,可以为 null,表示扫描所有图片 * @param loadedListener 图片加载完成的监听 */ public ImageDataSource(FragmentActivity activity, String path, OnImagesLoadedListener loadedListener) { this.activity = activity; this.loadedListener = loadedListener; LoaderManager loaderManager = activity.getSupportLoaderManager(); if (path == null) { loaderManager.initLoader(LOADER_ALL, null, this);//加载所有的图片 } else { //加载指定目录的图片 Bundle bundle = new Bundle(); bundle.putString("path", path); loaderManager.initLoader(LOADER_CATEGORY, bundle, this); } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = null; //扫描所有图片 if (id == LOADER_ALL)//时间逆序 cursorLoader = new CursorLoader(activity, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, null, null, IMAGE_PROJECTION[6] + " DESC"); //扫描某个图片文件夹 if (id == LOADER_CATEGORY) cursorLoader = new CursorLoader(activity, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, IMAGE_PROJECTION[1] + " like '%" + args.getString("path") + "%'", null, IMAGE_PROJECTION[6] + " DESC"); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { //imageFolders.clear(); ImageItem imageItem = new ImageItem(); //只取第一个 if (data != null) { // ArrayList<ImageItem> allImages = new ArrayList<>(); //所有图片的集合,不分文件夹 if (data.moveToFirst()) { //查询数据 String imageName = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0])); String imagePath = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1])); long imageSize = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2])); int imageWidth = data.getInt(data.getColumnIndexOrThrow(IMAGE_PROJECTION[3])); int imageHeight = data.getInt(data.getColumnIndexOrThrow(IMAGE_PROJECTION[4])); String imageMimeType = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[5])); long imageAddTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[6])); //long imageTokenTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[7])); /* SimpleDateFormat sdf= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); //前面的lSysTime是秒数,先乘1000得到毫秒数,再转为java.util.Date类型 java.util.Date dt = new Date(imageAddTime*1000); String sDateTime = sdf.format(dt); //得到精确到秒的表示:08/31/2006 21:08:00 dt = new Date(imageTokenTime); String sTakenTime = sdf.format(dt); Log.e("latestImage","imageAddTime=="+sDateTime+":::::"+imageTokenTime);*/ //封装实体 //ImageItem imageItem = new ImageItem(); imageItem.name = imageName; imageItem.path = imagePath; imageItem.size = imageSize; imageItem.width = imageWidth; imageItem.height = imageHeight; imageItem.mimeType = imageMimeType; imageItem.addTime = imageAddTime; } } //回调接口,通知图片数据准备完成 // ImagePicker.getInstance().setImageFolders(imageFolders); loadedListener.onImagesLoaded(imageItem); } @Override public void onLoaderReset(Loader<Cursor> loader) { } /** 所有图片加载完成的回调接口 */ public interface OnImagesLoadedListener { void onImagesLoaded(ImageItem imageItem); } }
调用的地方:
new ImageDataSource(this, null, this);
重写相关方法:
@Override public void onImagesLoaded(ImageItem imageItem) { System.out.println("tiem -- :" + imageItem.addTime); System.out.println("url -- :" + imageItem.path); System.out.println("name -- :" + imageItem.name); if (imageItem.path != null) { Glide.with(this).load(imageItem.path).into(imageView); } }
方法二:
// 按照时间排序获取最新的一张图片 Cursor cursor = SearchBox.getAppContext().getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Images.Media.DATE_ADDED + " DESC"); if (cursor == null){ return; } cursor.moveToFirst(); // 图片名称 String imageName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)); // 图片路径 String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)); // 图片插入时间 单位:s long imageAddTime = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED)); cursor.close();
作者:选一个昵称这么难
链接:https://www.jianshu.com/p/0118d6125321
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦