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 android.support.annotation.NonNull;
|
import android.support.v4.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();
|
}
|
}
|
}
|