| package org.apache.fineract.utils; |
| |
| import android.annotation.TargetApi; |
| import android.content.ContentUris; |
| import android.content.Context; |
| import android.database.Cursor; |
| import android.graphics.Bitmap; |
| 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 android.util.Log; |
| import android.webkit.MimeTypeMap; |
| |
| import java.io.File; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| |
| public class FileUtils { |
| |
| public static final String LOG_TAG = FileUtils.class.getSimpleName(); |
| |
| public static String getPathReal(final Context context, final Uri uri) { |
| if (AndroidVersionUtil.isApiVersionGreaterOrEqual(Build.VERSION_CODES.KITKAT)) { |
| return getPathRealOnKitkatAboveVersion(context, uri); |
| } else { |
| return getPathOnKitkatBelowVersion(context, uri); |
| } |
| } |
| |
| public static String getPathOnKitkatBelowVersion(Context context, Uri uri) { |
| if ("content".equalsIgnoreCase(uri.getScheme())) { |
| String[] projection = {"_data"}; |
| Cursor cursor = null; |
| |
| try { |
| cursor = context.getContentResolver().query(uri, projection, null, null, null); |
| int columnIndex = cursor.getColumnIndexOrThrow("_data"); |
| if (cursor.moveToFirst()) { |
| return cursor.getString(columnIndex); |
| } |
| } catch (Exception e) { |
| // Eat it |
| } |
| } else if ("file".equalsIgnoreCase(uri.getScheme())) { |
| return uri.getPath(); |
| } |
| |
| return null; |
| } |
| |
| @TargetApi(Build.VERSION_CODES.KITKAT) |
| public static String getPathRealOnKitkatAboveVersion(final Context context, final Uri uri) { |
| |
| final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; |
| |
| // DocumentProvider |
| if (isKitKat && 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.parseLong(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); |
| } |
| |
| // MediaStore (and general) |
| } else if ("content".equalsIgnoreCase(uri.getScheme())) { |
| |
| // Return the remote address |
| if (isGooglePhotosUri(uri)) { |
| return uri.getLastPathSegment(); |
| } |
| |
| return getDataColumn(context, uri, null, null); |
| |
| // File |
| } else if ("file".equalsIgnoreCase(uri.getScheme())) { |
| return uri.getPath(); |
| } |
| |
| return null; |
| } |
| |
| 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, projection, 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 null; |
| } |
| |
| |
| /** |
| * @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()); |
| } |
| |
| /** |
| * This Method for getting File Mime Type |
| * |
| * @param filePath Path of the file |
| * @return String Mime Type |
| */ |
| public static String getMimeType(String filePath) { |
| String type = null; |
| String extension = MimeTypeMap.getFileExtensionFromUrl(filePath); |
| if (extension != null) { |
| type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); |
| } |
| return type; |
| } |
| |
| @NonNull |
| public static String getMimeType(@NonNull File file) { |
| String type = null; |
| final String url = file.toString(); |
| final String extension = MimeTypeMap.getFileExtensionFromUrl(url); |
| if (extension != null) { |
| type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase()); |
| } |
| if (type == null) { |
| type = "image/*"; // fallback type. You might set it to */* |
| } |
| return type; |
| } |
| |
| /** |
| * This Method for writing InputStream into File. |
| * |
| * @param in InputStream |
| * @param file File |
| */ |
| public static void writeInputStreamDataToFile(InputStream in, File file) { |
| try { |
| OutputStream out = new FileOutputStream(file); |
| byte[] buf = new byte[1024]; |
| int len; |
| while ((len = in.read(buf)) > 0) { |
| out.write(buf, 0, len); |
| } |
| out.close(); |
| in.close(); |
| } catch (Exception e) { |
| Log.d(LOG_TAG, e.getLocalizedMessage()); |
| } |
| } |
| |
| public static void saveBitmap(Bitmap bitmap, File file) { |
| FileOutputStream out = null; |
| try { |
| out = new FileOutputStream(file); |
| bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); |
| } catch (Exception e) { |
| Log.d(LOG_TAG, e.getLocalizedMessage()); |
| } finally { |
| try { |
| if (out != null) { |
| out.close(); |
| } |
| } catch (IOException e) { |
| Log.d(LOG_TAG, e.getLocalizedMessage()); |
| } |
| } |
| } |
| |
| public static File createFile(String directoryName, String fileName) { |
| File directory = new File(Environment.getExternalStorageDirectory(), directoryName); |
| if (directory.exists()) { |
| directory.delete(); |
| directory.mkdirs(); |
| } |
| return new File(directory.getPath(), fileName); |
| } |
| } |