Как обновить / установить приложение программно - PullRequest
0 голосов
/ 08 октября 2019

Я решил создать свою собственную систему обновления и столкнулся с проблемой, которую не знаю, как ее исправить.

Я уже пробовал несколько вещей, но каждая из них заканчивалась одинаково

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) 

Я хочу что-то вроде этого

  1. Запустить приложение
  2. Проверить, есть ли новая версияприложения в сети
  3. Если есть, просто скачайте apk
  4. После окончания загрузки установите новую версию приложения

Есть ли у меняошибка в коде?

РЕДАКТИРОВАТЬ

Я пытался сделать это как 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))
...