diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java index 46efbe595d..c1074cf4c5 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java @@ -12,8 +12,6 @@ public final class AdaptScreenUtils { private static boolean isInitMiui = false; private static Field mTmpMetrics; - private static DisplayMetrics appDm; - /** * Adapt for the horizontal screen, and call it in [android.app.Activity.getResources]. */ @@ -68,10 +66,7 @@ public static int px2Pt(float pxValue) { } private static void setAppDmXdpi(final float xdpi) { - if (appDm == null) { - appDm = Utils.getApp().getResources().getDisplayMetrics(); - } - appDm.xdpi = xdpi; + Utils.getApp().getResources().getDisplayMetrics().xdpi = xdpi; } private static DisplayMetrics getDisplayMetrics(Resources resources) { diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java index ad9d78e2da..42e9771d2f 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java @@ -1,15 +1,22 @@ package com.blankj.utilcode.util; import android.content.ContentResolver; +import android.content.ContentUris; import android.content.CursorLoader; import android.database.Cursor; import android.net.Uri; import android.os.Build; +import android.os.Environment; +import android.os.ParcelFileDescriptor; +import android.provider.DocumentsContract; import android.provider.MediaStore; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.content.FileProvider; +import android.util.Log; import java.io.File; +import java.io.FileDescriptor; /** *
@@ -43,24 +50,85 @@ public static Uri file2Uri(@NonNull final File file) { /** * Uri to file. * - * @param uri The uri. - * @param columnName The name of the target column. - *e.g. {@link MediaStore.Images.Media#DATA}
+ * @param uri The uri. * @return file */ - public static File uri2File(@NonNull final Uri uri, final String columnName) { - if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { - return new File(uri.getPath()); + public static File uri2File(@NonNull final Uri uri) { + Log.d("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); + Log.d("UriUtils", uri.toString() + " parse failed. -> 0"); + return null; + } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { + return getFileFromUri(uri, null, null); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + && DocumentsContract.isDocumentUri(Utils.getApp(), 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]); + } + Log.d("UriUtils", uri.toString() + " parse failed. -> 2"); + 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(contentUri, null, null); + } 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 { + Log.d("UriUtils", uri.toString() + " parse failed. -> 3"); + return null; + } + final String selection = "_id=?"; + final String[] selectionArgs = new String[]{split[1]}; + return getFileFromUri(contentUri, selection, selectionArgs); + } else { + Log.d("UriUtils", uri.toString() + " parse failed. -> 4"); + return null; + } + } else { + Log.d("UriUtils", uri.toString() + " parse failed. -> 5"); + return null; } + } + + private static File getFileFromUri(@NonNull final Uri uri) { + return getFileFromUri(uri, null, null); + } + + private static File getFileFromUri(@NonNull final Uri uri, + final String selection, + final String[] selectionArgs) { CursorLoader cl = new CursorLoader(Utils.getApp()); cl.setUri(uri); - cl.setProjection(new String[]{columnName}); + cl.setProjection(new String[]{"_data"}); Cursor cursor = null; try { cursor = cl.loadInBackground(); - int columnIndex = cursor.getColumnIndexOrThrow(columnName); + int columnIndex = cursor.getColumnIndexOrThrow("_data"); cursor.moveToFirst(); return new File(cursor.getString(columnIndex)); + } catch (Exception e) { + Log.d("UriUtils", uri.toString() + " parse failed. -> 1"); + return null; } finally { if (cursor != null) { cursor.close(); diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java index c041c8b3bc..9d9112ff62 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java @@ -11,12 +11,12 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** *@@ -158,9 +158,9 @@ static boolean isAppForeground() { static class ActivityLifecycleImpl implements ActivityLifecycleCallbacks { final LinkedListmActivityList = new LinkedList<>(); - final HashMap