I have trouble with following code. The apk is downloaded perfectly and is saved in Downloads/Raman
direcotry, but gives me error:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hamed.demo, PID: 1177
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.hamed.demo (has extras) } in com.hamed.demo.AppsList$9@673ff0b
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1153)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:6274)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: android.os.FileUriExposedException: file:///file%3A/storage/emulated/0/Download/GadgetSaint/Sample-2.apk exposed beyond app through Intent.getData()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
at android.net.Uri.checkFileUriExposed(Uri.java:2351)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9043)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9004)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1519)
at android.app.Activity.startActivityForResult(Activity.java:4266)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
at android.app.Activity.startActivityForResult(Activity.java:4224)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720)
at android.app.Activity.startActivity(Activity.java:4563)
at android.app.Activity.startActivity(Activity.java:4531)
at com.hamed.demo.AppsList$9.onReceive(AppsList.java:313)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1143)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:6274)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
My code:
private void download_from_url(String url) {
Download_Uri = Uri.parse(url);
final DownloadManager[] downloadManager = {(DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE)};
DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
request.setAllowedOverRoaming(false);
request.setTitle("Raman Downloading " + "Sample" + ".apk");
request.setDescription("Downloading " + "Sample" + ".apk");
request.setVisibleInDownloadsUi(true);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "/Raman/" + "/" + "Sample" + ".apk");
final long refid = downloadManager[0].enqueue(request);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(refid);
downloadManager[0] = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
Cursor c = downloadManager[0].query(query);
if (c.moveToFirst()) {
int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
File file = new File(uriString);
Intent intent2 = new Intent(Intent.ACTION_VIEW);
intent2.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent2.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent2);
}
}
}
}
};
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
After adding the following code to onCreate
,
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
app doesn't crash, but keeps telling me:
There was a problem parsing the package
.
I have tested many different solution, but none of them worked. This one, this one and lots of other solutions doesn't work.