Skip to content

Commit

Permalink
修复一些bug,增加了date_taken字段
Browse files Browse the repository at this point in the history
  • Loading branch information
didikeeLuanon committed Jan 8, 2020
1 parent a952d4c commit eb6d35b
Show file tree
Hide file tree
Showing 10 changed files with 195 additions and 39 deletions.
14 changes: 13 additions & 1 deletion androidx/src/main/java/com/androidx/media/MediaUriInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
* create time: 2019-12-03 09:15
* description:
*/
public class MediaUriInfo extends BaseUriInfo implements Parcelable{
public class MediaUriInfo extends BaseUriInfo implements Parcelable {
private String displayName;
private String mimeType;
private int width;
Expand All @@ -20,6 +20,7 @@ public class MediaUriInfo extends BaseUriInfo implements Parcelable{
private long size;
private long dateAdded;
private long dateModified;
private long dateTaken;

public MediaUriInfo() {
}
Expand Down Expand Up @@ -110,6 +111,14 @@ public String getPath() {
}
}

public long getDateTaken() {
return dateTaken;
}

public void setDateTaken(long dateTaken) {
this.dateTaken = dateTaken;
}

@Override
public String toString() {
return "MediaUriInfo{" +
Expand All @@ -122,6 +131,7 @@ public String toString() {
", size=" + size +
", dateAdded=" + dateAdded +
", dateModified=" + dateModified +
", dateTaken=" + dateTaken +
'}';
}

Expand All @@ -135,6 +145,7 @@ protected MediaUriInfo(Parcel in) {
size = in.readLong();
dateAdded = in.readLong();
dateModified = in.readLong();
dateTaken = in.readLong();
}

public static final Creator<MediaUriInfo> CREATOR = new Creator<MediaUriInfo>() {
Expand Down Expand Up @@ -165,5 +176,6 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(size);
dest.writeLong(dateAdded);
dest.writeLong(dateModified);
dest.writeLong(dateTaken);
}
}
39 changes: 35 additions & 4 deletions androidx/src/main/java/com/androidx/picker/AbsMediaLoader.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.androidx.picker;

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;

Expand All @@ -13,20 +14,50 @@
* description:
*/
public abstract class AbsMediaLoader {
public static final String DATE_TAKEN = "datetaken";

public abstract ArrayList<MediaFolder> get(Context context, String folderPath);

public ArrayList<MediaFolder> get(Context context) {
return get(context, "");
}

/**
* 从哪个媒体库中查询数据
* @return
*/
protected abstract Uri getContentUri();

/**
* 查询是按照什么来排序的,一般是时间排序
* @return
*/
protected abstract String getOrder();

/**
* 筛选,和{@link AbsMediaLoader#getSelectionArgs()}是对应的
* @return 例如:MediaStore.MediaColumns.MIME_TYPE + "=?"
*/
protected abstract String getSelection();

/**
* 筛选,和{@link AbsMediaLoader#getSelection()}是对应的
* @return 例如:new String[]{"image/gif"}
*/
protected abstract String[] getSelectionArgs();

public abstract ArrayList<MediaFolder> get(Context context, String folderPath);
/**
* 添加特性类型文件特有的属性,比如图片的宽高(音乐文件却没有)
* @param projections
*/
protected abstract void addProjections(ArrayList<String> projections);

public ArrayList<MediaFolder> get(Context context) {
return get(context, "");
}
/**
* 绑定特有的属性到实体类中,参照 addProjections(ArrayList<String> projections);
* @param cursor
* @param mediaItem
*/
protected abstract void bindCursorData(Cursor cursor, MediaItem mediaItem);


protected String[] getParentInfoFromData(String data) {
Expand Down
26 changes: 19 additions & 7 deletions androidx/src/main/java/com/androidx/picker/AudioLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,6 @@ public ArrayList<MediaFolder> get(Context context, String folderPath) {
projections.add(MediaStore.Audio.Media.MIME_TYPE);
projections.add(MediaStore.Audio.Media.DATE_ADDED);
projections.add(MediaStore.Audio.Media.DATE_MODIFIED);
// audio
projections.add(MediaStore.Audio.Media.DURATION);
/**
* MediaStore.Video.Media.RELATIVE_PATH
* 相对路径 /storage/0000-0000/DCIM/Vacation/IMG1024.JPG} would have a path of {@code DCIM/Vacation/}.
Expand All @@ -57,6 +55,7 @@ public ArrayList<MediaFolder> get(Context context, String folderPath) {
} else {
projections.add(MediaStore.Audio.Media.DATA);
}
addProjections(projections);

Cursor cursor = contentResolver.query(externalContentUri, projections.toArray(new String[projections.size()]), selection, selectionArgs, order);
if (cursor == null) {
Expand Down Expand Up @@ -101,8 +100,6 @@ public ArrayList<MediaFolder> get(Context context, String folderPath) {
long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_ADDED));
long dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED));

long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));

//封装实体
MediaItem mediaItem = new MediaItem(uri);
mediaItem.setDisplayName(displayName);
Expand All @@ -112,9 +109,10 @@ public ArrayList<MediaFolder> get(Context context, String folderPath) {
mediaItem.setDateModified(dateModified);
mediaItem.setData(data);
mediaItem.setRelativePath(relativePath);
if (duration != -1) {
mediaItem.setDuration(duration);
}

// 专有参数
bindCursorData(cursor, mediaItem);


allMedias.add(mediaItem);

Expand Down Expand Up @@ -165,4 +163,18 @@ protected String[] getSelectionArgs() {
return null;
}

@Override
protected void addProjections(ArrayList<String> projections) {
// audio
projections.add(MediaStore.Audio.Media.DURATION);
}

@Override
protected void bindCursorData(Cursor cursor, MediaItem mediaItem) {
long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
if (duration != -1) {
mediaItem.setDuration(duration);
}
}

}
41 changes: 27 additions & 14 deletions androidx/src/main/java/com/androidx/picker/ImageLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,11 @@ private ArrayList<MediaFolder> load(Context context) {
String order = getOrder();
String selection = getSelection();
String[] selectionArgs = getSelectionArgs();

// projections
// common projections
ArrayList<String> projections = new ArrayList<>();
projections.add(MediaStore.MediaColumns._ID);
projections.add(MediaStore.MediaColumns.DISPLAY_NAME);
projections.add(MediaStore.MediaColumns.SIZE);
projections.add(MediaStore.MediaColumns.WIDTH);
projections.add(MediaStore.MediaColumns.HEIGHT);
projections.add(MediaStore.MediaColumns.MIME_TYPE);
projections.add(MediaStore.MediaColumns.DATE_ADDED);
projections.add(MediaStore.MediaColumns.DATE_MODIFIED);
Expand All @@ -66,6 +63,8 @@ private ArrayList<MediaFolder> load(Context context) {
// 真实路径 /storage/emulated/0/pp/downloader/wallpaper/aaa.jpg
projections.add(MediaStore.MediaColumns.DATA);
}
// 添加特定类型的参数
addProjections(projections);

Cursor cursor = contentResolver.query(externalContentUri, projections.toArray(new String[projections.size()]), selection, selectionArgs, order);
if (cursor == null) {
Expand Down Expand Up @@ -108,25 +107,22 @@ private ArrayList<MediaFolder> load(Context context) {
parentName = parentInfo[0];
parentPath = parentInfo[1];
}

MediaItem mediaItem = new MediaItem(uri);
// 这些是公用的参数
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE));
int width = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.WIDTH));
int height = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.HEIGHT));
long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_ADDED));
long dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED));

//封装实体
MediaItem mediaItem = new MediaItem(uri);
// 设置公共参数
mediaItem.setDisplayName(displayName);
mediaItem.setSize(size);
mediaItem.setWidth(width);
mediaItem.setHeight(height);
mediaItem.setMimeType(mimeType);
mediaItem.setDateAdded(dateAdded);
mediaItem.setDateModified(dateModified);
mediaItem.setData(data);
mediaItem.setRelativePath(relativePath);

// 添加专有参数
bindCursorData(cursor, mediaItem);

allMedias.add(mediaItem);

Expand Down Expand Up @@ -166,7 +162,7 @@ private ArrayList<MediaFolder> load(Context context) {
* @param mimeType
* @return
*/
private boolean isGif(String displayName, String mimeType) {
protected boolean isGif(String displayName, String mimeType) {
if (!TextUtils.isEmpty(displayName) && displayName.toLowerCase().endsWith(".gif")) {
return true;
}
Expand Down Expand Up @@ -203,8 +199,25 @@ protected String[] getSelectionArgs() {
}
}

@Override
protected void addProjections(ArrayList<String> projections) {
projections.add(MediaStore.MediaColumns.WIDTH);
projections.add(MediaStore.MediaColumns.HEIGHT);
}

@Override
protected void bindCursorData(Cursor cursor, MediaItem mediaItem) {
// 这些和类型绑定的
int width = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.WIDTH));
int height = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.HEIGHT));

//封装实体
mediaItem.setWidth(width);
mediaItem.setHeight(height);
}

@Override
public ArrayList<MediaFolder> get(Context context, String folderPath) {
return load(context,IMAGE);
return load(context, IMAGE);
}
}
35 changes: 35 additions & 0 deletions androidx/src/main/java/com/androidx/picker/MediaFolder.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,48 @@ public class MediaFolder implements Serializable, Parcelable {
public MediaFolder() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPath() {
return path;
}

public void setPath(String path) {
this.path = path;
}

public ArrayList<MediaItem> getItems() {
return items;
}

public void setItems(ArrayList<MediaItem> items) {
this.items = items;
}

public boolean isCheck() {
return check;
}

public void setCheck(boolean check) {
this.check = check;
}

public MediaItem getCover() {
if (items != null && items.size() > 0) {
return items.get(0);
}
return null;
}

public int getSize() {
return items == null ? 0 : items.size();
}

/** 只要文件夹的路径和名字相同,就认为是相同的文件夹 */
@Override
Expand Down
38 changes: 27 additions & 11 deletions androidx/src/main/java/com/androidx/picker/VideoLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,9 @@ public ArrayList<MediaFolder> get(Context context, String folderPath) {
projections.add(MediaStore.Video.Media._ID);
projections.add(MediaStore.Video.Media.DISPLAY_NAME);
projections.add(MediaStore.Video.Media.SIZE);
projections.add(MediaStore.Video.Media.WIDTH);
projections.add(MediaStore.Video.Media.HEIGHT);
projections.add(MediaStore.Video.Media.MIME_TYPE);
projections.add(MediaStore.Video.Media.DATE_ADDED);
projections.add(MediaStore.Video.Media.DATE_MODIFIED);
projections.add(MediaStore.Video.Media.DURATION);
/**
* MediaStore.Video.Media.RELATIVE_PATH
* 相对路径 /storage/0000-0000/DCIM/Vacation/IMG1024.JPG} would have a path of {@code DCIM/Vacation/}.
Expand All @@ -58,6 +55,7 @@ public ArrayList<MediaFolder> get(Context context, String folderPath) {
} else {
projections.add(MediaStore.Video.Media.DATA);
}
addProjections(projections);

Cursor cursor = contentResolver.query(externalContentUri, projections.toArray(new String[projections.size()]), selection, selectionArgs, order);
if (cursor == null) {
Expand Down Expand Up @@ -97,27 +95,25 @@ public ArrayList<MediaFolder> get(Context context, String folderPath) {
}

long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
int width = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.WIDTH));
int height = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.HEIGHT));

String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));

long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_ADDED));
long dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED));

//封装实体
MediaItem mediaItem = new MediaItem(uri);
mediaItem.setDisplayName(displayName);
mediaItem.setSize(size);
mediaItem.setWidth(width);
mediaItem.setHeight(height);
mediaItem.setMimeType(mimeType);
mediaItem.setDateAdded(dateAdded);
mediaItem.setDateModified(dateModified);
mediaItem.setData(data);
mediaItem.setRelativePath(relativePath);
if (duration != -1) {
mediaItem.setDuration(duration);
}

// 专有参数
bindCursorData(cursor, mediaItem);


allMedias.add(mediaItem);

Expand Down Expand Up @@ -167,4 +163,24 @@ protected String getSelection() {
protected String[] getSelectionArgs() {
return new String[]{"video/mp4"};
}

@Override
protected void addProjections(ArrayList<String> projections) {
projections.add(MediaStore.Video.Media.WIDTH);
projections.add(MediaStore.Video.Media.HEIGHT);
projections.add(MediaStore.Video.Media.DURATION);
}

@Override
protected void bindCursorData(Cursor cursor, MediaItem mediaItem) {
int width = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.WIDTH));
int height = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.HEIGHT));
long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));

mediaItem.setWidth(width);
mediaItem.setHeight(height);
if (duration != -1) {
mediaItem.setDuration(duration);
}
}
}
Loading

0 comments on commit eb6d35b

Please sign in to comment.