'Android install apk with Intent.VIEW_ACTION not working with File provider
My app has an auto-update feature that download an APK and when the download is finished that a Intent.VIEW_ACTION to open the app and let the user install the downloaded apk
Uri uri = Uri.parse("file://" + destination);
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
install.setDataAndType(uri,
manager.getMimeTypeForDownloadedFile(downloadId));
activity.startActivity(install);
This works great for all the device < 24
Now with Android 24 apparently we are not allowed any more to start intents with file:/// and after some googling it was advised to use A File Provider
new code:
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
install.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri apkUri = FileProvider.getUriForFile(AutoUpdate.this,
BuildConfig.APPLICATION_ID + ".provider", file);
install.setDataAndType(apkUri,
manager.getMimeTypeForDownloadedFile(downloadId));
activity.startActivity(install);
Now activity.startActivity(install); throws an error
No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://com.xxxx.xx.provider/MyFolder/Download/MyApkFile.apk typ=application/vnd.android.package-archive flg=0x4000000 }
Is there any way I can open the APK viewer in Android 7 (24) ?
Solution 1:[1]
I had this problem when calling start activity.after pausing my current activity, it suddenly came back and called onResume. like nothing happened. my problem was with this permission in manifest:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
almost no one mentioned that. so remember this. in sdk >= 24 you need to use provider because it needs an intent starting with file:/// below sdk 24 you should give uri starting with content:/// so that's why we need file provider for sdk 24 and above. I don't think I need to write any codes for this as @just_user has written correct answer. https://stacklearn.ir
Solution 2:[2]
This could be the problem, you have
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
in your example it should be
install.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
as install is the name of the intent.
Solution 3:[3]
You should note that for API < 24 you need to use:
setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive")
instead of setting data and type separately:
data = Uri.fromFile(apkFile)
type = "application/vnd.android.package-archive"
otherwise, you will get ActivityNotFoundException
Solution 4:[4]
For all of those who face the issue "There was a problem parsing this package.".
Set manualy the premissions.
ContextCompat.checkSelfPermission(getApplicationContext(), READ_EXTERNAL_STORAGE);
See this exemple : Download And Install App Programmatically
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Rob Francis |
| Solution 3 | MohammadReza |
| Solution 4 | Yaegaki2 |
