Skip to content

Commit 8cb3d9e

Browse files
author
didikeeLuanon
committed
StorageConnector 增加保存时的文件信息
1 parent eb6d35b commit 8cb3d9e

3 files changed

Lines changed: 240 additions & 57 deletions

File tree

androidx/src/main/java/com/androidx/StorageConnector.java

Lines changed: 41 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -157,30 +157,28 @@ public File getOutputFile() {
157157
}
158158

159159
public Uri save() {
160-
return save(internalTempSaveFile);
160+
return saveFile(internalTempSaveFile);
161161
}
162162

163+
@Deprecated
163164
public Uri save(File inputFile) {
165+
return saveFile(inputFile);
166+
}
167+
168+
public Uri saveFile(File inputFile) {
164169
if (inputFile == null || !inputFile.exists()) {
165170
Log.e(TAG, "c program maybe work failed,temp save is not exists");
166171
return null;
167172
}
168-
String fileName = inputFile.getName();
169-
if (TextUtils.isEmpty(mimeType)) {
170-
mimeType = getMimeType(fileName);
171-
}
172-
173-
ContentValues values = StorageUriUtils.makeMediaValues(
174-
folderPath,
175-
fileName,
176-
mimeType,
177-
0, 0,
178-
inputFile.length()
179-
);
173+
// 1. 获取 contentValues
174+
ContentValues contentValues = getContentValues(inputFile, folderPath, "", "");
180175
LogUtils.d("folderPath: " + folderPath + " mimeType: " + mimeType);
176+
LogUtils.d("StorageConnector saveFile() contentValues: " + contentValues.toString());
181177
ContentResolver contentResolver = context.getContentResolver();
178+
// 2. 获取对应媒体的插入 uri
182179
Uri mediaLocation = getMediaLocation(mimeType);
183-
Uri uri = contentResolver.insert(mediaLocation, values);
180+
// 3. 插入数据,如果成功继续,如果失败就直接返回
181+
Uri uri = contentResolver.insert(mediaLocation, contentValues);
184182
if (uri == null) {
185183
Log.e(TAG, "save StorageUriUtils.makeImageUri failed");
186184
return null;
@@ -199,8 +197,8 @@ public Uri save(File inputFile) {
199197
outputStream.write(buffer, 0, bytesRead);
200198
}
201199
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
202-
values.put(MediaStore.MediaColumns.IS_PENDING, false);
203-
contentResolver.update(uri, values, null, null);
200+
contentValues.put(MediaStore.MediaColumns.IS_PENDING, false);
201+
contentResolver.update(uri, contentValues, null, null);
204202
}
205203
return uri;
206204
} catch (Exception e) {
@@ -225,6 +223,10 @@ public Uri save(File inputFile) {
225223
return null;
226224
}
227225

226+
public ContentValues getContentValues(File file, String folderPath, String filename, String mimeType) {
227+
return StorageUriUtils.getContentValues(file, folderPath, filename, mimeType);
228+
}
229+
228230
protected boolean copyUri2File(Context context, Uri uri, File outputFile) {
229231
long start = System.currentTimeMillis();
230232
try {
@@ -280,52 +282,35 @@ public File getCacheDir(Context context) {
280282
}
281283

282284
protected String getMimeType(String filename) {
283-
String mimeType = MimeType.UNKNOWN;
284-
if (!TextUtils.isEmpty(filename)) {
285-
try {
286-
String extension = filename.substring(filename.lastIndexOf(".") + 1);
287-
if ("gif".equalsIgnoreCase(extension)) {
288-
mimeType = MimeType.GIF;
289-
} else if ("mp4".equalsIgnoreCase(extension)) {
290-
mimeType = MimeType.MP4;
291-
} else if ("png".equalsIgnoreCase(extension)) {
292-
mimeType = MimeType.PNG;
293-
} else if ("jpeg".equalsIgnoreCase(extension)) {
294-
mimeType = MimeType.JPEG;
295-
}else if ("mp3".equalsIgnoreCase(extension)){
296-
mimeType = MimeType.MP3;
297-
}else if ("aac".equalsIgnoreCase(extension)){
298-
mimeType = MimeType.AAC;
299-
}else if ("wav".equalsIgnoreCase(extension)){
300-
mimeType = MimeType.WAV;
285+
String extension = "";
286+
try {
287+
extension = filename.substring(filename.lastIndexOf(".") + 1);
288+
} catch (Exception e) {
289+
e.printStackTrace();
290+
}
291+
if (TextUtils.isEmpty(extension)) {
292+
return MimeType.UNKNOWN;
293+
} else {
294+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
295+
// aac要单独判断,因为4.4没有aac格式
296+
if ("aac".equalsIgnoreCase(extension)) {
297+
return MimeType.AAC;
301298
}
302-
} catch (Exception e) {
303-
e.printStackTrace();
304299
}
300+
return MimeType.getMimeTypeFromExtension(extension.toLowerCase());
305301
}
306-
return mimeType;
307302
}
308303

309304
protected Uri getMediaLocation(String mimeType) {
310-
Uri location;
311-
switch (mimeType) {
312-
case MimeType.GIF:
313-
case MimeType.JPEG:
314-
case MimeType.PNG:
315-
location = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
316-
break;
317-
case MimeType.MP4:
318-
location = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
319-
break;
320-
case MimeType.MP3:
321-
case MimeType.AAC:
322-
case MimeType.WAV:
323-
location = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
324-
break;
325-
default:
326-
location = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
327-
break;
305+
if (MimeType.isVideo(mimeType)) {
306+
return MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
307+
}
308+
if (MimeType.isImage(mimeType)) {
309+
return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
310+
}
311+
if (MimeType.isAudio(mimeType)) {
312+
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
328313
}
329-
return location;
314+
return MediaStore.Downloads.EXTERNAL_CONTENT_URI;
330315
}
331316
}

androidx/src/main/java/com/androidx/StorageUriUtils.java

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package com.androidx;
22

33
import android.content.ContentValues;
4+
import android.media.MediaMetadataRetriever;
45
import android.os.Build;
56
import android.provider.MediaStore;
7+
import android.text.TextUtils;
8+
9+
import com.androidx.media.MimeType;
10+
11+
import java.io.File;
612

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

30+
/**
31+
* 获取音频的参数
32+
* @return
33+
*/
34+
public static ContentValues makeAudioValues(String folderPath, String filename, String mimeType, long duration, long fileLength) {
35+
ContentValues values = makeBaseValues(folderPath, filename, mimeType, fileLength);
36+
values.put(MediaStore.MediaColumns.DURATION, duration);
37+
return values;
38+
}
39+
40+
41+
/**
42+
* 获取图片的参数
43+
* @return
44+
*/
45+
public static ContentValues makeImageValues(String folderPath, String filename, String mimeType, int width, int height, int rotate, long fileLength) {
46+
ContentValues values = makeBaseValues(folderPath, filename, mimeType, fileLength);
47+
values.put(MediaStore.MediaColumns.WIDTH, width);
48+
values.put(MediaStore.MediaColumns.HEIGHT, height);
49+
values.put(MediaStore.MediaColumns.ORIENTATION, rotate);
50+
return values;
51+
}
52+
53+
/**
54+
* 获取视频的信息
55+
* @return
56+
*/
57+
public static ContentValues makeVideoValues(String folderPath, String filename, String mimeType, int width, int height, long duration, int rotate, long fileLength) {
58+
if (TextUtils.isEmpty(mimeType)) {
59+
mimeType = "video/mp4";
60+
}
61+
ContentValues values = makeBaseValues(folderPath, filename, mimeType, fileLength);
62+
values.put(MediaStore.MediaColumns.WIDTH, width);
63+
values.put(MediaStore.MediaColumns.HEIGHT, height);
64+
values.put(MediaStore.MediaColumns.ORIENTATION, rotate);
65+
values.put(MediaStore.MediaColumns.DURATION, duration);
66+
return values;
67+
}
2468

2569
/**
2670
* 支持图片和视频
@@ -34,6 +78,7 @@ public static ContentValues makeVideoValues(String folderPath, String filename,
3478
* @param mimeType
3579
* @param fileLength
3680
*/
81+
@Deprecated
3782
public static ContentValues makeMediaValues(String folderPath, String filename, String mimeType, int width, int height, long fileLength) {
3883
ContentValues values = new ContentValues();
3984
values.put(MediaStore.MediaColumns.TITLE, filename);
@@ -49,7 +94,6 @@ public static ContentValues makeMediaValues(String folderPath, String filename,
4994
values.put(MediaStore.MediaColumns.SIZE, fileLength);
5095
}
5196
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
52-
// Set<String> externalVolumeNames = MediaStore.getExternalVolumeNames(context);
5397
values.put(MediaStore.Images.Media.RELATIVE_PATH, folderPath);
5498
values.put(MediaStore.MediaColumns.IS_PENDING, true);
5599
} else {
@@ -60,4 +104,88 @@ public static ContentValues makeMediaValues(String folderPath, String filename,
60104
}
61105

62106

107+
/**
108+
* 获取最基础的媒体信息
109+
* @param folderPath
110+
* @param filename
111+
* @param mimeType
112+
* @param fileLength
113+
* @return
114+
*/
115+
public static ContentValues makeBaseValues(String folderPath, String filename, String mimeType, long fileLength) {
116+
ContentValues values = new ContentValues();
117+
values.put(MediaStore.MediaColumns.TITLE, filename);
118+
values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename);
119+
values.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis() / 1000);
120+
values.put(MediaStore.MediaColumns.DATE_TAKEN, System.currentTimeMillis());
121+
values.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
122+
if (fileLength > 0) {
123+
values.put(MediaStore.MediaColumns.SIZE, fileLength);
124+
}
125+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
126+
values.put(MediaStore.MediaColumns.RELATIVE_PATH, folderPath);
127+
values.put(MediaStore.MediaColumns.IS_PENDING, true);
128+
} else {
129+
String data = StorageSaveUtils.getDataPath(folderPath, filename);
130+
values.put(MediaStore.MediaColumns.DATA, data);
131+
}
132+
return values;
133+
}
134+
135+
public static ContentValues getContentValues(File file, String folderPath, String filename, String mimeType) {
136+
if (file == null || TextUtils.isEmpty(folderPath)) {
137+
return null;
138+
}
139+
if (TextUtils.isEmpty(filename)) {
140+
filename = file.getName();
141+
}
142+
if (TextUtils.isEmpty(mimeType)) {
143+
mimeType = MimeType.getMimeTypeFromFilename(filename);
144+
}
145+
if (MimeType.isVideo(mimeType)) {
146+
long duration = 0;
147+
int width = 0;
148+
int height = 0;
149+
int rotate = 0;
150+
try {
151+
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
152+
retriever.setDataSource(file.getAbsolutePath());
153+
duration = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
154+
width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
155+
height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
156+
rotate = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION));
157+
} catch (Exception e) {
158+
e.printStackTrace();
159+
}
160+
return makeVideoValues(folderPath, filename, mimeType, width, height, duration, rotate, file.length());
161+
}
162+
if (MimeType.isAudio(mimeType)) {
163+
long duration = 0;
164+
try {
165+
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
166+
retriever.setDataSource(file.getAbsolutePath());
167+
duration = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
168+
} catch (Exception e) {
169+
e.printStackTrace();
170+
}
171+
return makeAudioValues(folderPath, filename, mimeType, duration, file.length());
172+
}
173+
if (MimeType.isImage(mimeType)) {
174+
int width = 0;
175+
int height = 0;
176+
int rotate = 0;
177+
try {
178+
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
179+
retriever.setDataSource(file.getAbsolutePath());
180+
width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH));
181+
height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT));
182+
rotate = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_ROTATION));
183+
} catch (Exception e) {
184+
e.printStackTrace();
185+
}
186+
return makeImageValues(folderPath, filename, mimeType, width, height, rotate, file.length());
187+
}
188+
return makeBaseValues(folderPath, filename, mimeType, file.length());
189+
}
190+
63191
}

androidx/src/main/java/com/androidx/media/MimeType.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.androidx.media;
22

3+
import android.os.Build;
4+
import android.text.TextUtils;
5+
import android.webkit.MimeTypeMap;
6+
37
/**
48
* user author: didikee
59
* create time: 2019-12-03 11:38
@@ -8,6 +12,9 @@
812
public final class MimeType {
913
public static final String UNKNOWN = "";
1014
public static final String ALL = "*/*";
15+
public static final String PREFIX_VIDEO = "video";
16+
public static final String PREFIX_AUDIO = "audio";
17+
public static final String PREFIX_IMAGE = "image";
1118
// image
1219
public static final String IMAGE = "image/*";
1320
public static final String PNG = "image/png";
@@ -27,4 +34,67 @@ public final class MimeType {
2734
public static final String M4A = "audio/mpeg";
2835

2936

37+
public static boolean isVideo(String mimeType) {
38+
return !TextUtils.isEmpty(mimeType) && mimeType.toLowerCase().startsWith(PREFIX_VIDEO);
39+
}
40+
41+
public static boolean isImage(String mimeType) {
42+
return !TextUtils.isEmpty(mimeType) && mimeType.toLowerCase().startsWith(PREFIX_IMAGE);
43+
}
44+
45+
public static boolean isAudio(String mimeType) {
46+
return !TextUtils.isEmpty(mimeType) && mimeType.toLowerCase().startsWith(PREFIX_AUDIO);
47+
}
48+
49+
/**
50+
* 根据类型,获取对应的拓展名
51+
* 核心类,已经被隐藏无法直接查看
52+
* http://androidxref.com/4.4.4_r1/xref/libcore/luni/src/main/java/libcore/net/MimeUtils.java
53+
*
54+
* @param extension
55+
* @return
56+
*/
57+
public static String getMimeTypeFromExtension(String extension) {
58+
String mimeTypeFromExtension = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
59+
if (TextUtils.isEmpty(mimeTypeFromExtension)) {
60+
return MimeType.UNKNOWN;
61+
} else {
62+
return mimeTypeFromExtension;
63+
}
64+
}
65+
66+
/**
67+
* 根据拓展名,或者类型名
68+
* @param mimeType
69+
* @return
70+
*/
71+
public static String getExtensionFromMimeType(String mimeType) {
72+
String extensionFromMimeType = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType);
73+
if (TextUtils.isEmpty(extensionFromMimeType)) {
74+
return "";
75+
} else {
76+
return extensionFromMimeType;
77+
}
78+
}
79+
80+
public static String getMimeTypeFromFilename(String filename) {
81+
String extension = "";
82+
try {
83+
extension = filename.substring(filename.lastIndexOf(".") + 1);
84+
} catch (Exception e) {
85+
e.printStackTrace();
86+
}
87+
if (TextUtils.isEmpty(extension)) {
88+
return UNKNOWN;
89+
} else {
90+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
91+
// aac要单独判断,因为4.4没有aac格式
92+
if ("aac".equalsIgnoreCase(extension)) {
93+
return AAC;
94+
}
95+
}
96+
return getMimeTypeFromExtension(extension.toLowerCase());
97+
}
98+
}
99+
30100
}

0 commit comments

Comments
 (0)