Intent.ACTION_INSTALL_PACKAGE устарела, как использовать установщик пакетов с широковещательным приемником просто в Kotlin? - PullRequest
0 голосов
/ 06 марта 2020

Я создал новый проект и начал работать над ним, когда заметил, что Intent.ACTION_INSTALL_PACKAGE устарела в API 29

Документы Google просто заявляют: эта константа устарела на уровне 29 API. Вместо этого используйте PackageInstaller

Документы здесь: https://developer.android.com/reference/kotlin/android/content/pm/PackageInstaller

Единственный вопрос переполнения стека здесь Как установить / обновить / удалить APK с помощью класса PackageInstaller в Android L ?

в настоящее время я загружаю через DownloadManager, а затем поочередно устанавливаю с приемником вещания.

Есть ли способ использовать этот приемник вещания, чтобы также использовать PackageInstaller? Или я должен проверить версию APK> = 29 и написать для нее совершенно новое решение ... Простые ответы в Kotlin предпочтительнее

Вот мой текущий код

//download function
val downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
    val uri = Uri.parse(link)
    val request = DownloadManager.Request(uri)
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
    request.setTitle("myapp.apk")
    request.setDestinationUri(Uri.fromFile(toDelete))
    val reference: Long = downloadManager.enqueue(request)

private val receiveDownload = object : BroadcastReceiver(){
        override fun onReceive(context: Context?, inten: Intent?) {
            /* Install the latest version */
            val downloadFolder: File? = if (android.os.Build.VERSION.SDK_INT >= 19) {
                getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
            } else {
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
            }
        val int: Intent
        val toInstall = File(downloadFolder, "/myapp.apk")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            val apkUri = FileProvider.getUriForFile(
                this@Login,
                BuildConfig.APPLICATION_ID + ".fileprovider", toInstall)
            int = Intent(Intent.ACTION_INSTALL_PACKAGE)
            int.data = apkUri
            int.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
        } else {
            val apkUri = Uri.fromFile(toInstall)
            int = Intent(Intent.ACTION_VIEW)
            int.setDataAndType(apkUri, "application/vnd.android.package-archive")
            int.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        }
        runOnUiThread {
            startActivity(int)
        }            
    }
}
...