Я решил создать свою собственную систему обновления и столкнулся с проблемой, которую не знаю, как ее исправить.
Я уже пробовал несколько вещей, но каждая из них заканчивалась одинаково
private fun startDownloading() {
var networkTask = NetworkTask(this)
networkTask.execute()
val url = "http://downloadsite.com/myApk.apk"
var downloadmanager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
var uri = Uri.parse(url)
var request = DownloadManager.Request(uri)
var filename = "app-release.apk"
var fullPath: String =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() +
"/" + filename
val myFile = File(fullPath)
if (myFile.exists())
myFile.delete()
request.setTitle("My File")
request.setDescription("Downloading")
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(false)
request.setDestinationUri(
Uri.parse("file://" + fullPath)
)
downloadmanager.enqueue(request)
var onComplete:BroadcastReceiver = object:BroadcastReceiver() {
override fun onReceive(context:Context, intent:Intent) {
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(Uri.fromFile(myFile), "application/vnd.android.package-archive")
startActivity(intent)
}
}
registerReceiver(onComplete, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
}
и я всегда получаю эту ошибку
E/AndroidRuntime: FATAL EXCEPTION: main
Process: sk.letsdream, PID: 30431
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=sk.letsdream (has extras) } in sk.letsdream.LoginActivity$startDownloading$onComplete$1@e2488a5
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1641)
at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:888)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8108)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Download/app-release.apk exposed beyond app through Intent.getData()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:2083)
at android.net.Uri.checkFileUriExposed(Uri.java:2393)
at android.content.Intent.prepareToLeaveProcess(Intent.java:11014)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10967)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1725)
at android.app.Activity.startActivityForResult(Activity.java:5326)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivityForResult(Activity.java:5267)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at android.app.Activity.startActivity(Activity.java:5697)
at android.app.Activity.startActivity(Activity.java:5665)
at sk.letsdream.LoginActivity$startDownloading$onComplete$1.onReceive(LoginActivity.kt:658)
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1631)
at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:888)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8108)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Я хочу что-то вроде этого
- Запустить приложение
- Проверить, есть ли новая версияприложения в сети
- Если есть, просто скачайте apk
- После окончания загрузки установите новую версию приложения
Есть ли у меняошибка в коде?
РЕДАКТИРОВАТЬ
Я пытался сделать это как this . Кажется, что он делает это, но я получаю сообщение об ошибке «При синтаксическом анализе пакета произошла ошибка» в смартфоне .... Вот дополнительный код, который я использовал
var fullPath: String =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() +
"/" + filename
val myFile = File(fullPath)
var onComplete:BroadcastReceiver = object:BroadcastReceiver() {
override fun onReceive(context:Context, intent:Intent) {
val uri = FileProvider.getUriForFile(
this@LoginActivity,
BuildConfig.APPLICATION_ID + ".provider",
myFile
)
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(uri, "application/vnd.android.package-archive")
startActivity(intent)
exitProcess(-1)
}
}
registerReceiver(onComplete, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))