Android: install .apk programmatically
android, installation
Solution
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));
Problem
I made this with help from Android download binary file problems and Install Application programmatically on Android. I want to make auto-update and auto-install at once. It is local so it's non-market application. Here is my code for it: ``` public void Update(String apkurl){ try { URL url = new URL(apkurl); HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); String PATH = Environment.getExternalStorageDirectory() + "/download/"; File file = new File(PATH); file.mkdirs(); File outputFile = new File(file, "app.apk"); FileOutputStream fos = new FileOutputStream(outputFile); InputStream is = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ((len1 = is.read(buffer)) != -1) { fos.write(buffer, 0, len1); } fos.close(); is.close();//till here, it works fine - .apk is download to my sdcard in download file Intent promptInstall = new Intent(Intent.ACTION_VIEW) .setData(Uri.parse(PATH+"app.apk")) .setType("application/android.com.app"); startActivity(promptInstall);//installation is not working } catch (IOException e) { Toast.makeText(getApplicationContext(), "Update error!", Toast.LENGTH_LONG).show(); } } ``` My permissions are `INTERNET`, `WRITE_EXTERNAL_STORAGE`, `INSTALL_PACKAGES`, and `DELETE_PACKAGES`. When Intent `promptInstall` is loaded, the app crashes =/ So, am I missing permissions or is my code incorrect, or is there a better way to do this?
Related problems
- Silent install apk programmatically by system app (without root)
- android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()
- Android install apk with Intent.VIEW_ACTION not working with File provider
- Install Application programmatically on Android
- Android download binary file problems
- Android Download Manager "Download Unsuccessful"
- Android: how to open an apk file after downloading for auto-update?
- URL - FileNotFoundException for image file in Android