diff --git a/README.md b/README.md index 63b1cf0..0f64971 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,24 @@ Notes - For properly opening _any_ file, you must already have a suitable reader for that particular file type installed on your device. Otherwise this will not work. - - [It is reported](https://github.com/pwlin/cordova-plugin-file-opener2/issues/2#issuecomment-41295793) that in iOS, you might need to remove `` from your `config.xml` - If you are wondering what MIME-type should you pass as the second argument to `open` function, [here is a list of all known MIME-types](http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=co) +Android APK installation limitation +--- +The following limitations apply when opening an APK file for installation: +- On Android 8+, your application must have the `ACTION_INSTALL_PACKAGE` permission. You can add it by adding this to your app's `config.xml` file: +``` + + + + + +``` + +- Before Android 7, you can only install APKs from the "external" partition. For example, you can install from `cordova.file.externalDataDirectory`, but **not** from `cordova.file.dataDirectory`. Android 7+ does not have this limitation. + Additional Android Functions --- The following functions are available in Android platform: diff --git a/src/android/io/github/pwlin/cordova/plugins/fileopener2/FileOpener2.java b/src/android/io/github/pwlin/cordova/plugins/fileopener2/FileOpener2.java index 541d5e4..d4b2fff 100644 --- a/src/android/io/github/pwlin/cordova/plugins/fileopener2/FileOpener2.java +++ b/src/android/io/github/pwlin/cordova/plugins/fileopener2/FileOpener2.java @@ -102,27 +102,29 @@ public class FileOpener2 extends CordovaPlugin { File file = new File(fileName); if (file.exists()) { try { - Uri path = Uri.fromFile(file); - Intent intent = new Intent(Intent.ACTION_VIEW); - if((Build.VERSION.SDK_INT >= 23 && !contentType.equals("application/vnd.android.package-archive")) || ((Build.VERSION.SDK_INT == 24 || Build.VERSION.SDK_INT == 25) && contentType.equals("application/vnd.android.package-archive"))) { - - Context context = cordova.getActivity().getApplicationContext(); - path = FileProvider.getUriForFile(context, cordova.getActivity().getPackageName() + ".opener.provider", file); + Intent intent; + if (contentType.equals("application/vnd.android.package-archive")) { + // https://stackoverflow.com/questions/9637629/can-we-install-an-apk-from-a-contentprovider/9672282#9672282 + intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); + Uri path; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + path = Uri.fromFile(file); + } else { + Context context = cordova.getActivity().getApplicationContext(); + path = FileProvider.getUriForFile(context, cordova.getActivity().getPackageName() + ".opener.provider", file); + } intent.setDataAndType(path, contentType); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - List infoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); - for (ResolveInfo resolveInfo : infoList) { - String packageName = resolveInfo.activityInfo.packageName; - context.grantUriPermission(packageName, path, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); - } - } - else { + } else { + intent = new Intent(Intent.ACTION_VIEW); + Context context = cordova.getActivity().getApplicationContext(); + Uri path = FileProvider.getUriForFile(context, cordova.getActivity().getPackageName() + ".opener.provider", file); intent.setDataAndType(path, contentType); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NO_HISTORY); + } + /* * @see * http://stackoverflow.com/questions/14321376/open-an-activity-from-a-cordovaplugin diff --git a/src/android/res/xml/opener_paths.xml b/src/android/res/xml/opener_paths.xml index 9dc2098..0ffc88e 100644 --- a/src/android/res/xml/opener_paths.xml +++ b/src/android/res/xml/opener_paths.xml @@ -1,8 +1,14 @@ + + - - - - + + + + + + + +