You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
7.5 KiB
Java
213 lines
7.5 KiB
Java
|
8 months ago
|
package com.rehome.zhdcoa.vpn;
|
||
|
|
|
||
|
|
import android.annotation.SuppressLint;
|
||
|
|
import android.annotation.TargetApi;
|
||
|
|
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.os.FileUtils;
|
||
|
|
import android.provider.DocumentsContract;
|
||
|
|
import android.provider.MediaStore;
|
||
|
|
import android.provider.OpenableColumns;
|
||
|
|
|
||
|
|
import androidx.annotation.RequiresApi;
|
||
|
|
|
||
|
|
import com.sangfor.sdk.utils.SFLogN;
|
||
|
|
|
||
|
|
import java.io.File;
|
||
|
|
import java.io.FileOutputStream;
|
||
|
|
import java.io.IOException;
|
||
|
|
import java.io.InputStream;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Created by sangfor on 17-9-28.
|
||
|
|
*/
|
||
|
|
public class CertUtils {
|
||
|
|
private static final String TAG = "CertUtils";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 根据Uri的不同Scheme解析出在本机的路径
|
||
|
|
* @param context
|
||
|
|
* @param uri
|
||
|
|
* @return Uri的真实路径
|
||
|
|
*/
|
||
|
|
@TargetApi(19)
|
||
|
|
public static String fromUriGetRealPath(Context context, Uri uri) {
|
||
|
|
if (uri == null) {
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
|
||
|
|
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
|
||
|
|
// DocumentProvider
|
||
|
|
if (isKitKat && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && DocumentsContract.isDocumentUri(context, uri) ) {
|
||
|
|
// ExternalStorageProvider
|
||
|
|
if (isExternalStorageDocument(uri)) {
|
||
|
|
final String docId = DocumentsContract.getDocumentId(uri);
|
||
|
|
final String[] split = docId.split(":");
|
||
|
|
final String type = split[0];
|
||
|
|
|
||
|
|
if ("primary".equalsIgnoreCase(type)) {
|
||
|
|
return Environment.getExternalStorageDirectory() + "/" + split[1];
|
||
|
|
}
|
||
|
|
|
||
|
|
// TODO handle non-primary volumes
|
||
|
|
}
|
||
|
|
// DownloadsProvider
|
||
|
|
else if (isDownloadsDocument(uri)) {
|
||
|
|
final String id = DocumentsContract.getDocumentId(uri);
|
||
|
|
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
|
||
|
|
|
||
|
|
return getDataColumn(context, contentUri, null, null);
|
||
|
|
}
|
||
|
|
// MediaProvider
|
||
|
|
else if (isMediaDocument(uri)) {
|
||
|
|
final String docId = DocumentsContract.getDocumentId(uri);
|
||
|
|
final String[] split = docId.split(":");
|
||
|
|
final String type = split[0];
|
||
|
|
|
||
|
|
Uri contentUri = null;
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
|
||
|
|
final String selection = "_id=?";
|
||
|
|
final String[] selectionArgs = new String[]{split[1]};
|
||
|
|
|
||
|
|
return getDataColumn(context, contentUri, selection, selectionArgs);
|
||
|
|
}
|
||
|
|
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||
|
|
return uriToFileApiQ(context, uri);
|
||
|
|
}
|
||
|
|
// MediaStore (and general)
|
||
|
|
else if ("content".equalsIgnoreCase(uri.getScheme())) {
|
||
|
|
|
||
|
|
// Return the remote address
|
||
|
|
if (isGooglePhotosUri(uri))
|
||
|
|
return uri.getLastPathSegment();
|
||
|
|
SFLogN.info(TAG, "uri authority is "+uri.getAuthority());
|
||
|
|
if (isHuaWeiUri(uri)) {
|
||
|
|
String uriPath = uri.getPath();
|
||
|
|
// content://com.huawei.filemanager.share.fileprovider/root/storage/emulated/0/hbz1.p12
|
||
|
|
if (uriPath != null && uriPath.startsWith("/root")) {
|
||
|
|
return uriPath.replaceAll("/root", "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return getDataColumn(context, uri, null, null);
|
||
|
|
}
|
||
|
|
// File
|
||
|
|
else if ("file".equalsIgnoreCase(uri.getScheme())) {
|
||
|
|
return uri.getPath();
|
||
|
|
}
|
||
|
|
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Android 10 以上适配
|
||
|
|
* @param context
|
||
|
|
* @param uri
|
||
|
|
* @return
|
||
|
|
*/
|
||
|
|
@RequiresApi(api = Build.VERSION_CODES.Q)
|
||
|
|
private static String uriToFileApiQ(Context context, Uri uri) {
|
||
|
|
File file = null;
|
||
|
|
//android10以上转换
|
||
|
|
if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
|
||
|
|
file = new File(uri.getPath());
|
||
|
|
} else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
|
||
|
|
//把文件复制到沙盒目录
|
||
|
|
ContentResolver contentResolver = context.getContentResolver();
|
||
|
|
Cursor cursor = contentResolver.query(uri, null, null, null, null);
|
||
|
|
if (cursor.moveToFirst()) {
|
||
|
|
@SuppressLint("Range")
|
||
|
|
String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
|
||
|
|
try {
|
||
|
|
InputStream is = contentResolver.openInputStream(uri);
|
||
|
|
File file1 = new File(context.getExternalCacheDir().getAbsolutePath()+"/"+System.currentTimeMillis());
|
||
|
|
if (!file1.exists())
|
||
|
|
{
|
||
|
|
file1.mkdir();
|
||
|
|
}
|
||
|
|
File cache = new File(file1.getPath(), displayName);
|
||
|
|
FileOutputStream fos = new FileOutputStream(cache);
|
||
|
|
FileUtils.copy(is, fos);
|
||
|
|
file = cache;
|
||
|
|
fos.close();
|
||
|
|
is.close();
|
||
|
|
} catch (IOException e) {
|
||
|
|
e.printStackTrace();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return file.getAbsolutePath();
|
||
|
|
}
|
||
|
|
|
||
|
|
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
|
||
|
|
|
||
|
|
Cursor cursor = null;
|
||
|
|
final String column = "_data";
|
||
|
|
final String[] projection = {column};
|
||
|
|
|
||
|
|
try {
|
||
|
|
cursor = context.getContentResolver().query(uri, null, selection, selectionArgs, null);
|
||
|
|
if (cursor != null && cursor.moveToFirst()) {
|
||
|
|
final int index = cursor.getColumnIndexOrThrow(column);
|
||
|
|
return cursor.getString(index);
|
||
|
|
}
|
||
|
|
} finally {
|
||
|
|
if (cursor != null)
|
||
|
|
cursor.close();
|
||
|
|
}
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param uri The Uri to check.
|
||
|
|
* @return Whether the Uri authority is ExternalStorageProvider.
|
||
|
|
*/
|
||
|
|
public static boolean isExternalStorageDocument(Uri uri) {
|
||
|
|
return "com.android.externalstorage.documents".equals(uri.getAuthority());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param uri The Uri to check.
|
||
|
|
* @return Whether the Uri authority is DownloadsProvider.
|
||
|
|
*/
|
||
|
|
public static boolean isDownloadsDocument(Uri uri) {
|
||
|
|
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param uri The Uri to check.
|
||
|
|
* @return Whether the Uri authority is MediaProvider.
|
||
|
|
*/
|
||
|
|
public static boolean isMediaDocument(Uri uri) {
|
||
|
|
return "com.android.providers.media.documents".equals(uri.getAuthority());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param uri The Uri to check.
|
||
|
|
* @return Whether the Uri authority is Google Photos.
|
||
|
|
*/
|
||
|
|
public static boolean isGooglePhotosUri(Uri uri) {
|
||
|
|
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 适配 华为手机
|
||
|
|
* @param uri
|
||
|
|
* @return
|
||
|
|
*/
|
||
|
|
public static boolean isHuaWeiUri(Uri uri) {
|
||
|
|
return "com.huawei.filemanager.share.fileprovider".equals(uri.getAuthority());
|
||
|
|
}
|
||
|
|
}
|