NIMSDK-AOS  9.19.0
UriUtils.java
浏览该文件的文档.
1 package com.netease.nimlib.sdk.util;
2 
3 import android.content.ContentResolver;
4 import android.content.Context;
5 import android.database.Cursor;
6 import android.graphics.Bitmap;
7 import android.media.MediaMetadataRetriever;
8 import android.net.Uri;
9 import android.provider.MediaStore;
10 import android.provider.OpenableColumns;
11 import android.text.TextUtils;
12 import android.webkit.MimeTypeMap;
13 import com.netease.nimlib.log.NimLog;
14 
15 public class UriUtils {
16 
17  private static final String TAG = "UriUtils";
18  private UriUtils() {}
19 
20  public static Uri string2Uri(String uriString) {
21  if(TextUtils.isEmpty(uriString))
22  {
23  return null;
24  }
25  Uri uri = null;
26  try {
27  uri = Uri.parse(uriString);
28  } catch (Throwable e) {
29  // URI格式不合法
30  NimLog.e(TAG,"stringToUri failed,uriString = "+uriString,e);
31  }
32  return uri;
33  }
34 
35  /**
36  * 判断URI是否为文件类型URI
37  *
38  * @param uriString URI字符串
39  * @return 是否为文件类型URI
40  */
41  public static boolean isFileUri(String uriString) {
42  if(TextUtils.isEmpty(uriString))
43  {
44  return false;
45  }
46  boolean isFileUri = false;
47  try {
48  Uri uri = Uri.parse(uriString);
49  isFileUri = ContentResolver.SCHEME_FILE.equals(uri.getScheme());
50  } catch (Throwable e) {
51  // URI格式不合法
52  NimLog.e(TAG,"File URI not valid",e);
53  }
54  return isFileUri;
55  }
56 
57  /**
58  * 判断URI是否为文件类型URI
59  *
60  * @param uri URI
61  * @return 是否为文件类型URI
62  */
63  public static boolean isFileUri(Uri uri) {
64  if(uri == null)
65  {
66  return false;
67  }
68  return ContentResolver.SCHEME_FILE.equals(uri.getScheme());
69  }
70 
71  /**
72  * 判断URI是否为Content类型URI
73  *
74  * @param uriString URI字符串
75  * @return 是否为Content类型URI
76  */
77  public static boolean isContentUri(String uriString) {
78  if(TextUtils.isEmpty(uriString))
79  {
80  return false;
81  }
82  boolean isContentUri = false;
83  try {
84  Uri uri = Uri.parse(uriString);
85  isContentUri = ContentResolver.SCHEME_CONTENT.equals(uri.getScheme());
86  } catch (Throwable e) {
87  // URI格式不合法
88  NimLog.e(TAG,"Content URI not valid",e);
89  }
90  return isContentUri;
91  }
92 
93  /**
94  * 判断URI是否为Content类型URI
95  *
96  * @param uri URI
97  * @return 是否为Content类型URI
98  */
99  public static boolean isContentUri(Uri uri) {
100  if(uri == null)
101  {
102  return false;
103  }
104  return ContentResolver.SCHEME_CONTENT.equals(uri.getScheme());
105  }
106 
107  /**
108  * 判断URI是否为File或者Content类型URI
109  * File类型URI表示私有文件
110  * Content类型URI表示共享文件,如图片,音频等
111  *
112  * @param uriString URI字符串
113  * @return 是否为File或者Content类型URI
114  */
115  public static boolean isFileOrContentUri(String uriString) {
116  if(TextUtils.isEmpty(uriString))
117  {
118  return false;
119  }
120  boolean isFileUri = false;
121  boolean isContentUri = false;
122  try {
123  Uri uri = Uri.parse(uriString);
124  isFileUri = ContentResolver.SCHEME_FILE.equals(uri.getScheme());
125  isContentUri = ContentResolver.SCHEME_CONTENT.equals(uri.getScheme());
126  } catch (Throwable e) {
127  // URI格式不合法
128  NimLog.e(TAG,"Content URI not valid",e);
129  }
130  return isFileUri || isContentUri;
131  }
132 
133  /**
134  * 判断URI是否为File或者Content类型URI
135  * File类型URI表示私有文件
136  * Content类型URI表示共享文件,如图片,音频等
137  *
138  * @param uri URI
139  * @return 是否为File或者Content类型URI
140  */
141  public static boolean isFileOrContentUri(Uri uri)
142  {
143  if(uri == null)
144  {
145  return false;
146  }
147  boolean isFileUri;
148  boolean isContentUri;
149  isFileUri = ContentResolver.SCHEME_FILE.equals(uri.getScheme());
150  isContentUri = ContentResolver.SCHEME_CONTENT.equals(uri.getScheme());
151  return isFileUri || isContentUri;
152  }
153 
154  /**
155  * 从URI中获取文件的扩展名,如果没有则返回空字符串
156  * @param context
157  * @param uri 文件uri
158  * @return 文件扩展名,如果没有则返回空字符串
159  */
160  public static String getFileExtensionFromUri(Context context,Uri uri) {
161  if(context == null || uri == null)
162  {
163  return "";
164  }
165  ContentResolver contentResolver = context.getContentResolver();
166  MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
167  // 获取文件的MIME类型
168  String mimeType = contentResolver.getType(uri);
169  // 获取文件的扩展名
170  String extension = mimeTypeMap.getExtensionFromMimeType(mimeType);
171  if (extension == null) {
172  String path = uri.getPath();
173  if (path != null) {
174  extension = MimeTypeMap.getFileExtensionFromUrl(path);
175  }
176  }
177  if(TextUtils.isEmpty(extension))
178  {
179  return "";
180  }
181  return extension;
182  }
183 
184  /**
185  * 从URI中获取文件的实际大小
186  * @param context
187  * @param uri 文件uri
188  * @return 文件的实际大小
189  */
190  public static long getFileSizeFromUri(Context context,Uri uri) {
191  if(context == null || uri == null)
192  {
193  return 0L;
194  }
195  Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
196  int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
197  long size = 0L;
198  if (cursor.moveToFirst()) {
199  // 获取文件大小
200  size = cursor.getLong(sizeIndex);
201  }
202  cursor.close();
203  // 返回文件的实际大小
204  return size;
205  }
206 
207  /**
208  * 判断文件是否存在
209  * @param context
210  * @param uri 文件uri
211  * @return 文件是否存在
212  */
213  public static boolean isFileExists(Context context,Uri uri) {
214  if(context == null || uri == null)
215  {
216  return false;
217  }
218  String[] projection = {MediaStore.Images.Media.DATA};
219  Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
220  // 如果游标不为空并且游标中存在数据,说明文件存在,关闭游标并返回true
221  if (cursor != null && cursor.moveToFirst()) {
222  cursor.close();
223  return true;
224  }
225  // 文件不存在或无法访问,关闭游标并返回false
226  if (cursor != null) {
227  cursor.close();
228  }
229  return false;
230  }
231 
232  /**
233  * 从视频文件的URI生成缩略图
234  * @param context
235  * @param uri
236  * @param width
237  * @param height
238  * @return
239  */
240  public static Bitmap generateVideoThumbnail(Context context,Uri uri, int width, int height) {
241  if(context == null || uri == null)
242  {
243  return null;
244  }
245  Bitmap thumbnail = null;
246  MediaMetadataRetriever retriever = new MediaMetadataRetriever();
247  try {
248  // 设置MediaMetadataRetriever对象的数据源为视频文件的URI
249  retriever.setDataSource(context, uri);
250  // 获取视频文件的第一帧作为缩略图
251  thumbnail = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
252  // 调整缩略图大小
253  if (thumbnail != null) {
254  thumbnail = Bitmap.createScaledBitmap(thumbnail, width, height, true);
255  }
256  } catch (Throwable e) {
257  NimLog.e(TAG, "generateVideoThumbnail error:"+e,e);
258  } finally {
259  try {
260  retriever.release();
261  }
262  catch (Throwable e) {
263  NimLog.e(TAG, "MediaMetadataRetriever release error:"+e,e);
264  }
265  }
266  // 返回缩略图
267  return thumbnail;
268  }
269 
270  public static String getFileNameFromUri(Context context, Uri uri) {
271  if(context == null || uri == null)
272  {
273  return null;
274  }
275  String fileName = null;
276  Cursor cursor = null;
277  try {
278  String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};
279  cursor = context.getContentResolver().query(uri, projection, null, null, null);
280  if (cursor != null && cursor.moveToFirst()) {
281  int index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME);
282  fileName = cursor.getString(index);
283  }
284  }
285  catch (Throwable e) {
286  NimLog.e(TAG, "getFileNameFromUri error:"+e,e);
287  }
288  finally {
289  if (cursor != null) {
290  cursor.close();
291  }
292  }
293  return fileName;
294  }
295 }
static boolean isFileUri(Uri uri)
判断URI是否为文件类型URI
Definition: UriUtils.java:63
static Bitmap generateVideoThumbnail(Context context, Uri uri, int width, int height)
从视频文件的URI生成缩略图
Definition: UriUtils.java:240
static long getFileSizeFromUri(Context context, Uri uri)
从URI中获取文件的实际大小
Definition: UriUtils.java:190
static String getFileNameFromUri(Context context, Uri uri)
Definition: UriUtils.java:270
static boolean isFileOrContentUri(String uriString)
判断URI是否为File或者Content类型URI File类型URI表示私有文件 Content类型URI表示共享文件,如图片,音频...
Definition: UriUtils.java:115
static boolean isFileUri(String uriString)
判断URI是否为文件类型URI
Definition: UriUtils.java:41
static Uri string2Uri(String uriString)
Definition: UriUtils.java:20
static boolean isContentUri(Uri uri)
判断URI是否为Content类型URI
Definition: UriUtils.java:99
static String getFileExtensionFromUri(Context context, Uri uri)
从URI中获取文件的扩展名,如果没有则返回空字符串
Definition: UriUtils.java:160
static boolean isFileOrContentUri(Uri uri)
判断URI是否为File或者Content类型URI File类型URI表示私有文件 Content类型URI表示共享文件,如图片,音频...
Definition: UriUtils.java:141
static boolean isContentUri(String uriString)
判断URI是否为Content类型URI
Definition: UriUtils.java:77
static boolean isFileExists(Context context, Uri uri)
判断文件是否存在
Definition: UriUtils.java:213