Skip to content

Commit

Permalink
增加音频的获取
Browse files Browse the repository at this point in the history
  • Loading branch information
didikeeLuanon committed Jan 6, 2020
1 parent beef22f commit b82fc53
Show file tree
Hide file tree
Showing 6 changed files with 163 additions and 12 deletions.
2 changes: 1 addition & 1 deletion androidx/src/main/java/com/androidx/LogUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*/
public class LogUtils {
private static final String TAG = "AndroidX";
private static boolean DEBUG = false;
private static boolean DEBUG = true;

public static void setDebug(boolean debug){
DEBUG = debug;
Expand Down
4 changes: 4 additions & 0 deletions androidx/src/main/java/com/androidx/media/MimeType.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@ public final class MimeType {
// video
public static final String VIDEO = "video/*";
public static final String MP4 = "video/mp4";
public static final String _3GP = "video/3gp";
// audio
public static final String AUDIO = "audio/*";
public static final String MP3 = "audio/mpeg";
public static final String AAC = "audio/aac";
public static final String _3GPP = "audio/3gpp";
public static final String WAV = "audio/x-wav";
public static final String AMR = "audio/amr";
public static final String M4A = "audio/mpeg";


}
147 changes: 147 additions & 0 deletions androidx/src/main/java/com/androidx/picker/AudioLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package com.androidx.picker;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.text.TextUtils;

import com.androidx.R;

import java.util.ArrayList;

/**
* user author: didikee
* create time: 2020-01-6 1:24
* description: 获取手机里的音频
*/
public class AudioLoader extends AbsMediaLoader {

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

public ArrayList<MediaFolder> getAudios(Context context, String folderPath) {
if (context == null) {
return null;
}
ContentResolver contentResolver = context.getContentResolver();
if (contentResolver == null) {
return null;
}

Uri externalContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String order = MediaStore.MediaColumns.DATE_ADDED + " DESC";
String selection = MediaStore.MediaColumns.MIME_TYPE + "=?";
String[] selectionArgs = new String[]{"audio/"};

// projections
ArrayList<String> projections = new ArrayList<>();
projections.add(MediaStore.Audio.Media._ID);
projections.add(MediaStore.Audio.Media.DISPLAY_NAME);
projections.add(MediaStore.Audio.Media.SIZE);
projections.add(MediaStore.Audio.Media.MIME_TYPE);
projections.add(MediaStore.Audio.Media.DATE_ADDED);
projections.add(MediaStore.Audio.Media.DATE_MODIFIED);
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/}.
*
* MediaStore.Video.Media.DATA 在android10上已经过时了
* 真实路径 /storage/emulated/0/pp/downloader/wallpaper/aaa.jpg
*/
if (Build.VERSION.SDK_INT >= 29/*android 10*/) {
projections.add(MediaStore.Audio.Media.RELATIVE_PATH);
} else {
projections.add(MediaStore.Audio.Media.DATA);
}

Cursor cursor = contentResolver.query(externalContentUri, projections.toArray(new String[projections.size()]), selection, selectionArgs, order);
if (cursor == null) {
return null;
}

ArrayList<MediaFolder> mediaFolders = new ArrayList<>();
ArrayList<MediaItem> allMedias = new ArrayList<>();
while (cursor.moveToNext()) {
//查询数据
String id = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID));
String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));

// 现在全部改为uri来实现
Uri uri = ContentUris.withAppendedId(externalContentUri, Long.parseLong(id));

String data = "";
String relativePath = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
relativePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.RELATIVE_PATH));
} else {
data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA));
}
// 获取父目录的信息,用于文件夹分类
String parentName = "";
String parentPath = "";
if (!TextUtils.isEmpty(data)) {
String[] parentInfo = getParentInfoFromData(data);
parentName = parentInfo[0];
parentPath = parentInfo[1];
}

if (!TextUtils.isEmpty(relativePath)) {
String[] parentInfo = getParentInfoFromRelativePath(relativePath);
parentName = parentInfo[0];
parentPath = parentInfo[1];
}

long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE));
long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.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.setMimeType(mimeType);
mediaItem.setDateAdded(dateAdded);
mediaItem.setDateModified(dateModified);
mediaItem.setData(data);
mediaItem.setRelativePath(relativePath);
if (duration != -1) {
mediaItem.setDuration(duration);
}

allMedias.add(mediaItem);

//根据父路径分类存放图片
MediaFolder mediaFolder = new MediaFolder();
mediaFolder.name = parentName;
mediaFolder.path = parentPath;

if (mediaFolders.contains(mediaFolder)) {
mediaFolders.get(mediaFolders.indexOf(mediaFolder)).items.add(mediaItem);
} else {
ArrayList<MediaItem> images = new ArrayList<>();
images.add(mediaItem);
mediaFolder.items = images;
mediaFolders.add(mediaFolder);
}
}
// 防止没有图片报异常
if (cursor.getCount() > 0 && allMedias.size() > 0) {
//构造所有图片的集合
MediaFolder allImagesFolder = new MediaFolder();
allImagesFolder.name = context.getString(R.string.recently);
allImagesFolder.path = "";
allImagesFolder.items = allMedias;
mediaFolders.add(0, allImagesFolder);//确保第一条是所有图片
}
cursor.close();
return mediaFolders;
}
}
6 changes: 3 additions & 3 deletions androidx/src/main/java/com/androidx/picker/ImageLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,11 @@ private ArrayList<MediaFolder> load(Context context, String mimeType) {
if (indexOf == -1) {
ArrayList<MediaItem> images = new ArrayList<>();
images.add(mediaItem);
mediaFolder.images = images;
mediaFolder.items = images;
mediaFolders.add(mediaFolder);
} else {
// contain
mediaFolders.get(indexOf).images.add(mediaItem);
mediaFolders.get(indexOf).items.add(mediaItem);
}
}
// 防止没有图片报异常
Expand All @@ -162,7 +162,7 @@ private ArrayList<MediaFolder> load(Context context, String mimeType) {
MediaFolder allImagesFolder = new MediaFolder();
allImagesFolder.name = context.getString(R.string.recently);
allImagesFolder.path = "";
allImagesFolder.images = allMedias;
allImagesFolder.items = allMedias;
mediaFolders.add(0, allImagesFolder); //确保第一条是所有图片
}
cursor.close();
Expand Down
10 changes: 5 additions & 5 deletions androidx/src/main/java/com/androidx/picker/MediaFolder.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@ public class MediaFolder implements Serializable, Parcelable {

public String name; //当前文件夹的名字
public String path; //当前文件夹的路径
public ArrayList<MediaItem> images; //当前文件夹下所有图片的集合
public ArrayList<MediaItem> items; //当前文件夹下所有图片的集合

public boolean check; //当前文件夹是否选中

public MediaFolder() {
}

public MediaItem getCover() {
if (images != null && images.size() > 0) {
return images.get(0);
if (items != null && items.size() > 0) {
return items.get(0);
}
return null;
}
Expand All @@ -44,7 +44,7 @@ public boolean equals(Object o) {
protected MediaFolder(Parcel in) {
name = in.readString();
path = in.readString();
images = in.createTypedArrayList(MediaItem.CREATOR);
items = in.createTypedArrayList(MediaItem.CREATOR);
check = in.readByte() != 0;
}

Expand All @@ -69,7 +69,7 @@ public int describeContents() {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(path);
dest.writeTypedList(images);
dest.writeTypedList(items);
dest.writeByte((byte) (check ? 1 : 0));
}
}
6 changes: 3 additions & 3 deletions androidx/src/main/java/com/androidx/picker/VideoLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -130,11 +130,11 @@ public ArrayList<MediaFolder> getVideos(Context context, String folderPath) {
mediaFolder.path = parentPath;

if (mediaFolders.contains(mediaFolder)) {
mediaFolders.get(mediaFolders.indexOf(mediaFolder)).images.add(mediaItem);
mediaFolders.get(mediaFolders.indexOf(mediaFolder)).items.add(mediaItem);
} else {
ArrayList<MediaItem> images = new ArrayList<>();
images.add(mediaItem);
mediaFolder.images = images;
mediaFolder.items = images;
mediaFolders.add(mediaFolder);
}
}
Expand All @@ -144,7 +144,7 @@ public ArrayList<MediaFolder> getVideos(Context context, String folderPath) {
MediaFolder allImagesFolder = new MediaFolder();
allImagesFolder.name = context.getString(R.string.recently);
allImagesFolder.path = "";
allImagesFolder.images = allMedias;
allImagesFolder.items = allMedias;
mediaFolders.add(0, allImagesFolder); //确保第一条是所有图片
}
cursor.close();
Expand Down

0 comments on commit b82fc53

Please sign in to comment.