From c02b5e18e7d79a9b3aaba426fa18491f39610c2c Mon Sep 17 00:00:00 2001 From: Miguel Ruivo Date: Wed, 12 Sep 2018 17:13:05 +0100 Subject: [PATCH] adds FilePath utils class and removes previous commons dependency --- android/.idea/caches/build_file_checksums.ser | Bin 496 -> 496 bytes android/.idea/misc.xml | 2 +- android/build.gradle | 3 +- .../flutter/plugin/filepicker/FilePath.java | 156 ++++++++++++++++++ .../plugin/filepicker/FilePickerPlugin.java | 15 +- 5 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 android/src/main/java/com/mr/flutter/plugin/filepicker/FilePath.java diff --git a/android/.idea/caches/build_file_checksums.ser b/android/.idea/caches/build_file_checksums.ser index b21651998b9731c5a0d66f9eec4592d1cc00cd17..107229adcaf697ccf986e33e5b5ed813bdd0cec6 100644 GIT binary patch delta 36 ucmV+<0NelY1MmZomjz|cj8i<3oahkRm@BrVd*kZtSam*CCWmm7lmT2%m=Ur7 delta 36 ucmV+<0NelY1MmZomjz_;G7?3RoahiSd~E2DqlGYGV(EzX=7F)3lmT2js}aQj diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml index c0f68ed..99202cc 100644 --- a/android/.idea/misc.xml +++ b/android/.idea/misc.xml @@ -25,7 +25,7 @@ - + diff --git a/android/build.gradle b/android/build.gradle index ce7e1fb..1e9b1b1 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -34,6 +34,5 @@ android { } dependencies { - implementation 'in.gauriinfotech:commons:1.0.8' - //compileOnly files('tmplibs/flutter.jar') + implementation 'com.android.support:appcompat-v7:27.0.0' } diff --git a/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePath.java b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePath.java new file mode 100644 index 0000000..3055cb0 --- /dev/null +++ b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePath.java @@ -0,0 +1,156 @@ +package com.mr.flutter.plugin.filepicker; +import android.annotation.TargetApi; +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.util.Log; + +/** + * Credits to NiRRaNjAN from package in.gauriinfotech.commons;. + **/ +public class FilePath +{ + + private static final String tag = "FilePathPicker"; + + public static String getPath(final Uri uri, Context context) + { + final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + if (isKitKat) + { + return getForApi19(context, uri); + } else if ("content".equalsIgnoreCase(uri.getScheme())) + { + if (isGooglePhotosUri(uri)) + { + return uri.getLastPathSegment(); + } + return getDataColumn(context, uri, null, null); + } else if ("file".equalsIgnoreCase(uri.getScheme())) + { + return uri.getPath(); + } + return null; + } + + @TargetApi(19) + private static String getForApi19(Context context, Uri uri) + { + Log.e(tag, "+++ API 19 URI :: " + uri); + if (DocumentsContract.isDocumentUri(context, uri)) + { + Log.e(tag, "+++ Document URI"); + if (isExternalStorageDocument(uri)) + { + Log.e(tag, "+++ External Document URI"); + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + if ("primary".equalsIgnoreCase(type)) + { + Log.e(tag, "+++ Primary External Document URI"); + return Environment.getExternalStorageDirectory() + "/" + split[1]; + } + } else if (isDownloadsDocument(uri)) + { + Log.e(tag, "+++ Downloads External Document 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); + } else if (isMediaDocument(uri)) + { + Log.e(tag, "+++ Media Document URI"); + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) + { + Log.e(tag, "+++ Image Media Document URI"); + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if ("video".equals(type)) + { + Log.e(tag, "+++ Video Media Document URI"); + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if ("audio".equals(type)) + { + Log.e(tag, "+++ Audio Media Document URI"); + 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 ("content".equalsIgnoreCase(uri.getScheme())) + { + Log.e(tag, "+++ No DOCUMENT URI :: CONTENT "); + if (isGooglePhotosUri(uri)) + return uri.getLastPathSegment(); + + return getDataColumn(context, uri, null, null); + } else if ("file".equalsIgnoreCase(uri.getScheme())) + { + Log.e(tag, "+++ No DOCUMENT URI :: FILE "); + return uri.getPath(); + } + return null; + } + + private 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; + } + + private static boolean isExternalStorageDocument(Uri uri) + { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + private static boolean isDownloadsDocument(Uri uri) + { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + private static boolean isMediaDocument(Uri uri) + { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + + private static boolean isGooglePhotosUri(Uri uri) + { + return "com.google.android.apps.photos.content".equals(uri.getAuthority()); + } + +} \ No newline at end of file diff --git a/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java index a8a141e..c99d5e1 100644 --- a/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java +++ b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java @@ -5,17 +5,16 @@ import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; +import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.util.Log; import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; -import in.gauriinfotech.commons.Commons; + import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; @@ -47,7 +46,7 @@ public class FilePickerPlugin implements MethodCallHandler { if (data != null) { Uri uri = data.getData(); Log.i(TAG, "URI:" +data.getData().toString()); - String fullPath = Commons.getPath(uri, instance.context()); + String fullPath = FilePath.getPath(uri, instance.context()); String cloudFile = null; if(fullPath == null) @@ -115,9 +114,15 @@ public class FilePickerPlugin implements MethodCallHandler { } private void startFileExplorer() { + Intent intent; if (checkPermission()) { - Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT){ + intent = new Intent(Intent.ACTION_PICK); + }else{ + intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + } + intent.setType("application/pdf"); intent.addCategory(Intent.CATEGORY_OPENABLE); instance.activity().startActivityForResult(intent, REQUEST_CODE);