package com.hdl.sdk.ttl_sdk.utlis; 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.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import androidx.annotation.NonNull; import androidx.core.content.FileProvider; import java.io.File; /** * Created by JLChen on 2019/7/25 */ public class HDLUriUtils { public static final String AUTHORITY = ".upgrade.fileProvider"; private HDLUriUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); } /** * File to uri. * * @param file The file. * @return uri */ public static Uri file2Uri(@NonNull final Context context, @NonNull final File file) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { String authority = context.getPackageName() + AUTHORITY; return FileProvider.getUriForFile(context, authority, file); } else { return Uri.fromFile(file); } } /** * Uri to file. * * @param uri The uri. * @return file */ public static File uri2File(@NonNull final Context context, @NonNull final Uri uri) { HDLLog.Log("UriUtils "+ uri.toString()); String authority = uri.getAuthority(); String scheme = uri.getScheme(); if (ContentResolver.SCHEME_FILE.equals(scheme)) { String path = uri.getPath(); if (path != null) return new File(path); HDLLog.Log("UriUtils " + uri.toString() + " parse failed. -> 0"); return null; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) { if ("com.android.externalstorage.documents".equals(authority)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return new File(Environment.getExternalStorageDirectory() + "/" + split[1]); } HDLLog.Log("UriUtils "+ uri.toString() + " parse failed. -> 1"); return null; } else if ("com.android.providers.downloads.documents".equals(authority)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id) ); return getFileFromUri(context, contentUri, 2); } else if ("com.android.providers.media.documents".equals(authority)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } else { HDLLog.Log("UriUtils " + uri.toString() + " parse failed. -> 3"); return null; } final String selection = "_id=?"; final String[] selectionArgs = new String[]{split[1]}; return getFileFromUri(context, contentUri, selection, selectionArgs, 4); } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { return getFileFromUri(context, uri, 5); } else { HDLLog.Log("UriUtils " + uri.toString() + " parse failed. -> 6"); return null; } } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { return getFileFromUri(context, uri, 7); } else { HDLLog.Log("UriUtils "+ uri.toString() + " parse failed. -> 8"); return null; } } private static File getFileFromUri(final Context context, final Uri uri, final int code) { return getFileFromUri(context, uri, null, null, code); } private static File getFileFromUri(final Context context, final Uri uri, final String selection, final String[] selectionArgs, final int code) { final Cursor cursor = context.getContentResolver().query( uri, new String[]{"_data"}, selection, selectionArgs, null); if (cursor == null) { HDLLog.Log("UriUtils "+ uri.toString() + " parse failed(cursor is null). -> " + code); return null; } try { if (cursor.moveToFirst()) { final int columnIndex = cursor.getColumnIndex("_data"); if (columnIndex > -1) { return new File(cursor.getString(columnIndex)); } else { HDLLog.Log("UriUtils " + uri.toString() + " parse failed(columnIndex: " + columnIndex + " is wrong). -> " + code); return null; } } else { HDLLog.Log("UriUtils "+ uri.toString() + " parse failed(moveToFirst return false). -> " + code); return null; } } catch (Exception e) { HDLLog.Log("UriUtils " + uri.toString() + " parse failed. -> " + code); return null; } finally { cursor.close(); } } }