android - 如何在没有 Play 商店的情况下自动更新 android 应用程序?
问题描述
当我尝试此代码时,当我尝试安装fille-->内容的路径时出现错误,然后在安装时出现“解析包时出现问题”错误。
此代码在 android studio 的更新点击事件中。
String destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";
String fileName = "battlegame.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();
}
String url = downloadurl;
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("Updating....");
request.setTitle("Battle Game");
request.setDestinationUri(uri);
final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = manager.enqueue(request);
final String finalDestination = destination;
BroadcastReceiver onComplete = new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
Log.d("Update status", "Download completed "+uri.toString()+" id "+String.valueOf(downloadId));
Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(Uri.fromFile(new File(finalDestination)),
"application/vnd.android.package-archive");
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(install);
unregisterReceiver(this);
}
};
registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
我的下载完全正常,但安装应用程序不起作用。我得到以下错误。我为它粘贴了logcat..
D/Update status: Download completed file:///storage/emulated/0/Download/battlegame.apk id 135
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.di.battlegame, PID: 7344
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.di.battlegame (has extras) } in com.di.battlegame.FirstActivity$1$2$1@c0b3ffb
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1560)
at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Download/battlegame.apk exposed beyond app through Intent.getData()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:2083)
at android.net.Uri.checkFileUriExposed(Uri.java:2388)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10791)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10744)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1703)
at android.app.Activity.startActivityForResult(Activity.java:5192)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
at android.app.Activity.startActivityForResult(Activity.java:5150)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
at android.app.Activity.startActivity(Activity.java:5521)
at android.app.Activity.startActivity(Activity.java:5489)
at com.di.battlegame.FirstActivity$1$2$1.onReceive(FirstActivity.java:191)
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1550)
at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process: Sending signal. PID: 7344 SIG: 9
Process 7344 terminated.
解决此问题后,我在安装应用程序时在 android 设备上收到此错误。
我得到解析包错误时出现问题。
点击这里
看看我的问题。
解决方案
从 N 开始,您不能将 Uri file:// 暴露给其他应用程序,请改用FileProvider。
推荐阅读
- python - 结合2个python字典列表
- scala - 如何使用 spark 读取数据框中的 json 字符串文件
- excel - 只读打开的excel文件用VBA保存但根本不保存?
- java - 无法在 Java 中使用 UPDATEXML 更新带有外来字符的 clob
- android - 鉴于我们有其注册令牌,如何向特定设备发送通知?
- php - 使用准备好的 select 语句循环遍历行
- model-view-controller - 非数据库“动作”在 MVC 中的位置在哪里?例如。发送电子邮件、使用网络服务等
- java - 如何将 @Context 注释字段注入 RestEasy @Provider?
- sql - SQL Server:如何从选择结果中删除相同/相反的值(+ 和 - 符号)
- r - 为(非引用)j 表达式提供名称作为字符向量