Skip to content

Commit

Permalink
StorageConnector 增加保存时的文件信息
Browse files Browse the repository at this point in the history
  • Loading branch information
didikeeLuanon committed Jan 11, 2020
1 parent eb6d35b commit 8cb3d9e
Show file tree
Hide file tree
Showing 3 changed files with 240 additions and 57 deletions.
97 changes: 41 additions & 56 deletions androidx/src/main/java/com/androidx/StorageConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -157,30 +157,28 @@ public File getOutputFile() {
}

public Uri save() {
return save(internalTempSaveFile);
return saveFile(internalTempSaveFile);
}

@Deprecated
public Uri save(File inputFile) {
return saveFile(inputFile);
}

public Uri saveFile(File inputFile) {
if (inputFile == null || !inputFile.exists()) {
Log.e(TAG, "c program maybe work failed,temp save is not exists");
return null;
}
String fileName = inputFile.getName();
if (TextUtils.isEmpty(mimeType)) {
mimeType = getMimeType(fileName);
}

ContentValues values = StorageUriUtils.makeMediaValues(
folderPath,
fileName,
mimeType,
0, 0,
inputFile.length()
);
// 1. 获取 contentValues
ContentValues contentValues = getContentValues(inputFile, folderPath, "", "");
LogUtils.d("folderPath: " + folderPath + " mimeType: " + mimeType);
LogUtils.d("StorageConnector saveFile() contentValues: " + contentValues.toString());
ContentResolver contentResolver = context.getContentResolver();
// 2. 获取对应媒体的插入 uri
Uri mediaLocation = getMediaLocation(mimeType);
Uri uri = contentResolver.insert(mediaLocation, values);
// 3. 插入数据,如果成功继续,如果失败就直接返回
Uri uri = contentResolver.insert(mediaLocation, contentValues);
if (uri == null) {
Log.e(TAG, "save StorageUriUtils.makeImageUri failed");
return null;
Expand All @@ -199,8 +197,8 @@ public Uri save(File inputFile) {
outputStream.write(buffer, 0, bytesRead);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.put(MediaStore.MediaColumns.IS_PENDING, false);
contentResolver.update(uri, values, null, null);
contentValues.put(MediaStore.MediaColumns.IS_PENDING, false);
contentResolver.update(uri, contentValues, null, null);
}
return uri;
} catch (Exception e) {
Expand All @@ -225,6 +223,10 @@ public Uri save(File inputFile) {
return null;
}

public ContentValues getContentValues(File file, String folderPath, String filename, String mimeType) {
return StorageUriUtils.getContentValues(file, folderPath, filename, mimeType);
}

protected boolean copyUri2File(Context context, Uri uri, File outputFile) {
long start = System.currentTimeMillis();
try {
Expand Down Expand Up @@ -280,52 +282,35 @@ public File getCacheDir(Context context) {
}

protected String getMimeType(String filename) {
String mimeType = MimeType.UNKNOWN;
if (!TextUtils.isEmpty(filename)) {
try {
String extension = filename.substring(filename.lastIndexOf(".") + 1);
if ("gif".equalsIgnoreCase(extension)) {
mimeType = MimeType.GIF;
} else if ("mp4".equalsIgnoreCase(extension)) {
mimeType = MimeType.MP4;
} else if ("png".equalsIgnoreCase(extension)) {
mimeType = MimeType.PNG;
} else if ("jpeg".equalsIgnoreCase(extension)) {
mimeType = MimeType.JPEG;
}else if ("mp3".equalsIgnoreCase(extension)){
mimeType = MimeType.MP3;
}else if ("aac".equalsIgnoreCase(extension)){
mimeType = MimeType.AAC;
}else if ("wav".equalsIgnoreCase(extension)){
mimeType = MimeType.WAV;
String extension = "";
try {
extension = filename.substring(filename.lastIndexOf(".") + 1);
} catch (Exception e) {
e.printStackTrace();
}
if (TextUtils.isEmpty(extension)) {
return MimeType.UNKNOWN;
} else {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
// aac要单独判断,因为4.4没有aac格式
if ("aac".equalsIgnoreCase(extension)) {
return MimeType.AAC;
}
} catch (Exception e) {
e.printStackTrace();
}
return MimeType.getMimeTypeFromExtension(extension.toLowerCase());
}
return mimeType;
}

protected Uri getMediaLocation(String mimeType) {
Uri location;
switch (mimeType) {
case MimeType.GIF:
case MimeType.JPEG:
case MimeType.PNG:
location = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
break;
case MimeType.MP4:
location = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
break;
case MimeType.MP3:
case MimeType.AAC:
case MimeType.WAV:
location = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
break;
default:
location = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
break;
if (MimeType.isVideo(mimeType)) {
return MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}
if (MimeType.isImage(mimeType)) {
return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
if (MimeType.isAudio(mimeType)) {
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
return location;
return MediaStore.Downloads.EXTERNAL_CONTENT_URI;
}
}
130 changes: 129 additions & 1 deletion androidx/src/main/java/com/androidx/StorageUriUtils.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package com.androidx;

import android.content.ContentValues;
import android.media.MediaMetadataRetriever;
import android.os.Build;
import android.provider.MediaStore;
import android.text.TextUtils;

import com.androidx.media.MimeType;

import java.io.File;

/**
* user author: didikee
Expand All @@ -21,6 +27,44 @@ public static ContentValues makeVideoValues(String folderPath, String filename,
return makeMediaValues(folderPath, filename, "video/mp4", 0, 0, fileLength);
}

/**
* 获取音频的参数
* @return
*/
public static ContentValues makeAudioValues(String folderPath, String filename, String mimeType, long duration, long fileLength) {
ContentValues values = makeBaseValues(folderPath, filename, mimeType, fileLength);
values.put(MediaStore.MediaColumns.DURATION, duration);
return values;
}


/**
* 获取图片的参数
* @return
*/
public static ContentValues makeImageValues(String folderPath, String filename, String mimeType, int width, int height, int rotate, long fileLength) {
ContentValues values = makeBaseValues(folderPath, filename, mimeType, fileLength);
values.put(MediaStore.MediaColumns.WIDTH, width);
values.put(MediaStore.MediaColumns.HEIGHT, height);
values.put(MediaStore.MediaColumns.ORIENTATION, rotate);
return values;
}

/**
* 获取视频的信息
* @return
*/
public static ContentValues makeVideoValues(String folderPath, String filename, String mimeType, int width, int height, long duration, int rotate, long fileLength) {
if (TextUtils.isEmpty(mimeType)) {
mimeType = "video/mp4";
}
ContentValues values = makeBaseValues(folderPath, filename, mimeType, fileLength);
values.put(MediaStore.MediaColumns.WIDTH, width);
values.put(MediaStore.MediaColumns.HEIGHT, height);
values.put(MediaStore.MediaColumns.ORIENTATION, rotate);
values.put(MediaStore.MediaColumns.DURATION, duration);
return values;
}

/**
* 支持图片和视频
Expand All @@ -34,6 +78,7 @@ public static ContentValues makeVideoValues(String folderPath, String filename,
* @param mimeType
* @param fileLength
*/
@Deprecated
public static ContentValues makeMediaValues(String folderPath, String filename, String mimeType, int width, int height, long fileLength) {
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.TITLE, filename);
Expand All @@ -49,7 +94,6 @@ public static ContentValues makeMediaValues(String folderPath, String filename,
values.put(MediaStore.MediaColumns.SIZE, fileLength);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Set<String> externalVolumeNames = MediaStore.getExternalVolumeNames(context);
values.put(MediaStore.Images.Media.RELATIVE_PATH, folderPath);
values.put(MediaStore.MediaColumns.IS_PENDING, true);
} else {
Expand All @@ -60,4 +104,88 @@ public static ContentValues makeMediaValues(String folderPath, String filename,
}


/**
* 获取最基础的媒体信息
* @param folderPath
* @param filename
* @param mimeType
* @param fileLength
* @return
*/
public static ContentValues makeBaseValues(String folderPath, String filename, String mimeType, long fileLength) {
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.TITLE, filename);
values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename);
values.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis() / 1000);
values.put(MediaStore.MediaColumns.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
if (fileLength > 0) {
values.put(MediaStore.MediaColumns.SIZE, fileLength);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.put(MediaStore.MediaColumns.RELATIVE_PATH, folderPath);
values.put(MediaStore.MediaColumns.IS_PENDING, true);
} else {
String data = StorageSaveUtils.getDataPath(folderPath, filename);
values.put(MediaStore.MediaColumns.DATA, data);
}
return values;
}

public static ContentValues getContentValues(File file, String folderPath, String filename, String mimeType) {
if (file == null || TextUtils.isEmpty(folderPath)) {
return null;
}
if (TextUtils.isEmpty(filename)) {
filename = file.getName();
}
if (TextUtils.isEmpty(mimeType)) {
mimeType = MimeType.getMimeTypeFromFilename(filename);
}
if (MimeType.isVideo(mimeType)) {
long duration = 0;
int width = 0;
int height = 0;
int rotate = 0;
try {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(file.getAbsolutePath());
duration = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
rotate = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION));
} catch (Exception e) {
e.printStackTrace();
}
return makeVideoValues(folderPath, filename, mimeType, width, height, duration, rotate, file.length());
}
if (MimeType.isAudio(mimeType)) {
long duration = 0;
try {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(file.getAbsolutePath());
duration = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
} catch (Exception e) {
e.printStackTrace();
}
return makeAudioValues(folderPath, filename, mimeType, duration, file.length());
}
if (MimeType.isImage(mimeType)) {
int width = 0;
int height = 0;
int rotate = 0;
try {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(file.getAbsolutePath());
width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH));
height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT));
rotate = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_ROTATION));
} catch (Exception e) {
e.printStackTrace();
}
return makeImageValues(folderPath, filename, mimeType, width, height, rotate, file.length());
}
return makeBaseValues(folderPath, filename, mimeType, file.length());
}

}
70 changes: 70 additions & 0 deletions androidx/src/main/java/com/androidx/media/MimeType.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.androidx.media;

import android.os.Build;
import android.text.TextUtils;
import android.webkit.MimeTypeMap;

/**
* user author: didikee
* create time: 2019-12-03 11:38
Expand All @@ -8,6 +12,9 @@
public final class MimeType {
public static final String UNKNOWN = "";
public static final String ALL = "*/*";
public static final String PREFIX_VIDEO = "video";
public static final String PREFIX_AUDIO = "audio";
public static final String PREFIX_IMAGE = "image";
// image
public static final String IMAGE = "image/*";
public static final String PNG = "image/png";
Expand All @@ -27,4 +34,67 @@ public final class MimeType {
public static final String M4A = "audio/mpeg";


public static boolean isVideo(String mimeType) {
return !TextUtils.isEmpty(mimeType) && mimeType.toLowerCase().startsWith(PREFIX_VIDEO);
}

public static boolean isImage(String mimeType) {
return !TextUtils.isEmpty(mimeType) && mimeType.toLowerCase().startsWith(PREFIX_IMAGE);
}

public static boolean isAudio(String mimeType) {
return !TextUtils.isEmpty(mimeType) && mimeType.toLowerCase().startsWith(PREFIX_AUDIO);
}

/**
* 根据类型,获取对应的拓展名
* 核心类,已经被隐藏无法直接查看
* http://androidxref.com/4.4.4_r1/xref/libcore/luni/src/main/java/libcore/net/MimeUtils.java
*
* @param extension
* @return
*/
public static String getMimeTypeFromExtension(String extension) {
String mimeTypeFromExtension = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
if (TextUtils.isEmpty(mimeTypeFromExtension)) {
return MimeType.UNKNOWN;
} else {
return mimeTypeFromExtension;
}
}

/**
* 根据拓展名,或者类型名
* @param mimeType
* @return
*/
public static String getExtensionFromMimeType(String mimeType) {
String extensionFromMimeType = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType);
if (TextUtils.isEmpty(extensionFromMimeType)) {
return "";
} else {
return extensionFromMimeType;
}
}

public static String getMimeTypeFromFilename(String filename) {
String extension = "";
try {
extension = filename.substring(filename.lastIndexOf(".") + 1);
} catch (Exception e) {
e.printStackTrace();
}
if (TextUtils.isEmpty(extension)) {
return UNKNOWN;
} else {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
// aac要单独判断,因为4.4没有aac格式
if ("aac".equalsIgnoreCase(extension)) {
return AAC;
}
}
return getMimeTypeFromExtension(extension.toLowerCase());
}
}

}

0 comments on commit 8cb3d9e

Please sign in to comment.