Android: install .apk programmatically
I solved the problem. I made mistake in setData(Uri)
and setType(String)
.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
That is correct now, my auto-update is working. Thanks for help. =)
Edit 20.7.2016:
After a long time, I had to use this way of updating again in another project. I encountered a number of problems with old solution. A lot of things have changed in that time, so I had to do this with a different approach. Here is the code:
//get destination to update file and set Uri
//TODO: First I wanted to store my update .apk file on internal storage for my app but apparently android does not allow you to open and install
//aplication with existing package from there. So for me, alternative solution is Download directory in external storage. If there is better
//solution, please inform us in comment
String destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";
String fileName = "AppName.apk";
destination += fileName;
final Uri uri = Uri.parse("file://" + destination);
//Delete update file if exists
File file = new File(destination);
if (file.exists())
//file.delete() - test this, I think sometimes it doesnt work
file.delete();
//get url of app on server
String url = Main.this.getString(R.string.update_app_url);
//set downloadmanager
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription(Main.this.getString(R.string.notification_description));
request.setTitle(Main.this.getString(R.string.app_name));
//set destination
request.setDestinationUri(uri);
// get download service and enqueue file
final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = manager.enqueue(request);
//set BroadcastReceiver to install app when .apk is downloaded
BroadcastReceiver onComplete = new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
install.setDataAndType(uri,
manager.getMimeTypeForDownloadedFile(downloadId));
startActivity(install);
unregisterReceiver(this);
finish();
}
};
//register receiver for when .apk download is compete
registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
How to install any Android app programmatically in Android 10
If you want install application programmatically in Android 10, You need to give permission to install app for your application
Steps 1: Give permission in Manifest
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Step 2: Write provider in Android Manifest
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
Step 4: Create file in XML folder named as provider_paths.xml and write
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="files_root"
path="Android/data/${applicationId}" />
<external-path
name="external_files"
path="." />
</paths>
how to install apk programmatically from another app in android
It seems the problem is that you set wrong uri to intent data:
install.setData(Uri.fromFile(file));
You need to set uri which was created with FileProvider:
Uri uri = FileProvider.getUriForFile(getApplicationContext(), "com.example.myapp", file);
install.setData(uri);
The same is done in the instruction you have found:
val contentUri = FileProvider.getUriForFile(
context,
BuildConfig.APPLICATION_ID + PROVIDER_PATH,
File(destination)
)
val install = Intent(Intent.ACTION_VIEW)
install.data = contentUri
install apk programmatically in android 8 (API 26)
You should be add a new permission.
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
Cannot launch APK file so user can install it, Android 9 onward?
So after a lot of search, I finally figured out the problem. For android 9 onward, we need an extra permission in AndroidManifest.xml
.
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
This isn't really needed for earlier versions of Android. Anyways after adding the permission, the problem got solved for API level >=28.
Related Topics
How to Access My Localhost from My Android Device
How to Enable or Disable the Gps Programmatically on Android
How to Prevent a Dialog from Closing When a Button Is Clicked
Changing Locale Within the App Itself
How to Disable Orientation Change on Android
How to Store Image as Blob in Sqlite & How to Retrieve It
Open Facebook Page from Android App
Android Sqlite Database: Slow Insertion
What Does @Hide Mean in the Android Source Code
Detect Whether There Is an Internet Connection Available on Android
Libraries Do Not Get Added to Apk Anymore After Upgrade to Adt 22
Key Hash For Android-Facebook App
Java Finished With Non-Zero Exit Value 2 - Android Gradle
App Not Installed' Error on Android