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