1 、圖片數(shù)據(jù)庫都有哪些字段
【_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
* 圖片內(nèi)容URI: MediaStore.Images.Media.EXTERNAL_CONTENT_URI
* 音頻內(nèi)容URI: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
* 視頻內(nèi)容URI: MediaStore.Video.Media.EXTERNAL_CONTENT_URI
* @return 所有圖片的list前痘,map是每個圖片在數(shù)據(jù)庫中的列信息
*/
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、監(jiān)測圖庫更新
原理很簡單陪拘,自定義一個類繼承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中響應(yīng)數(shù)據(jù)庫變化舅世,并進(jìn)行相應(yīng)處理
*/
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
}
}
調(diào)用的地方很關(guān)鍵:
private void registerContentObserver() {
mScreenObserver = new ScreenshotContentObserver(MainActivity.this, mHandler);
registerContentObserver();
/*之前說過,非常關(guān)鍵的Uri*/
Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
getContentResolver().registerContentObserver(imageUri, false, mScreenObserver);
}
在registerContentObserver()方法里长踊,傳入什么Uri阱佛,就會監(jiān)聽什么數(shù)據(jù)庫的變化麦萤,常用的幾種Uri在上面已經(jīng)有所提及姻檀。
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 = { //查詢圖片需要的數(shù)據(jù)列
MediaStore.Images.Media.DISPLAY_NAME, //圖片的顯示名稱 aaa.jpg
MediaStore.Images.Media.DATA, //圖片的真實(shí)路徑 /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;
/**
* 圖片加載完成的回調(diào)接口
*/
private OnImagesLoadedListener loadedListener;
/**
* @param activity 用于初始化LoaderManager,需要兼容到2.3
* @param path 指定掃描的文件夾目錄,可以為 null哈扮,表示掃描所有圖片
* @param loadedListener 圖片加載完成的監(jiān)聽
*/
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()) {
//查詢數(shù)據(jù)
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是秒數(shù)铐料,先乘1000得到毫秒數(shù),再轉(zhuǎn)為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);*/
//封裝實(shí)體
//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;
}
}
//回調(diào)接口,通知圖片數(shù)據(jù)準(zhǔn)備完成
// ImagePicker.getInstance().setImageFolders(imageFolders);
loadedListener.onImagesLoaded(imageItem);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
/** 所有圖片加載完成的回調(diào)接口 */
public interface OnImagesLoadedListener {
void onImagesLoaded(ImageItem imageItem);
}
}
調(diào)用的地方:
new ImageDataSource(this, null, this);
重寫相關(guān)方法:
@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 = context.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();
其中query()方法的最后一個參數(shù)表明是按照什么排列。