Android學習-相容Android7.0,8.0版本升級更新(程式碼片段記錄)(Kotlin)
阿新 • • 發佈:2019-01-08
Android7.0需要fileprovider宣告,
Android8.0需要新增 申明許可權
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//新增8.0應用單個的安裝許可權判斷 activity?.let { if (it.packageManager.canRequestPackageInstalls()) { //使用此方法判斷該應用有沒有開啟允許安裝未知應用的功能 install(it, File(filePath)) } else { alert { //此處使用了anko功能 所以直接使用alert message = "點選確定,設定允許未知來源應用安裝開關即可立即升級更新" negativeButton("確定") { val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) startActivityForResult(intent, 999) it.dismiss() } positiveButton("取消") { it.dismiss() } }.show() } } } else { activity?.apply { install(this, File(filePath)) } } } else { installAPP(Uri.parse("file://" + filePath), context) } private fun installAPP(data: Uri, context: Context) { val promptInstall = Intent(Intent.ACTION_VIEW) .setDataAndType(data, "application/vnd.android.package-archive") // FLAG_ACTIVITY_NEW_TASK 可以保證安裝成功時可以正常開啟 app promptInstall.flags = Intent.FLAG_ACTIVITY_NEW_TASK context.startActivity(promptInstall) } fun install(context: Context, downloadfile: File) { val intent = Intent(Intent.ACTION_VIEW) val apkUri = getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", downloadfile) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) intent.setDataAndType(apkUri, "application/vnd.android.package-archive") context.startActivity(intent) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 999) { activity?.let { //嚴格來講此處應該再次判斷是否已經開啟許可權 install(it, File(filePath)) } } }