diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b952496..35cef3b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,8 +16,8 @@ android { applicationId = "com.rainy.token" minSdk = 31 targetSdk = 35 - versionCode = 17 - versionName = "1.6.7" + versionCode = 18 + versionName = "1.6.8" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9cd6552..83aafee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + diff --git a/app/src/main/java/com/rainy/token/ui/settings/UpdateViewModel.kt b/app/src/main/java/com/rainy/token/ui/settings/UpdateViewModel.kt index 6cd9d95..41183ff 100644 --- a/app/src/main/java/com/rainy/token/ui/settings/UpdateViewModel.kt +++ b/app/src/main/java/com/rainy/token/ui/settings/UpdateViewModel.kt @@ -80,19 +80,31 @@ class UpdateViewModel @Inject constructor( } fun install(file: File) { - if (context.packageManager.canRequestPackageInstalls()) { - _uiState.update { it.copy(phase = Phase.Ready(file)) } - val authority = context.packageName + ".fileprovider" - val uri = FileProvider.getUriForFile(context, authority, file) - val intent = Intent(Intent.ACTION_VIEW).apply { + if (!context.packageManager.canRequestPackageInstalls()) { + _uiState.update { it.copy(phase = Phase.NeedInstallPermission) } + return + } + _uiState.update { it.copy(phase = Phase.Ready(file)) } + val authority = context.packageName + ".fileprovider" + val uri = try { + FileProvider.getUriForFile(context, authority, file) + } catch (e: Exception) { + _uiState.update { it.copy(phase = Phase.Error("安装文件无效:" + (e.message ?: "未知错误"))) } + return + } + val actionView = Intent(Intent.ACTION_VIEW).apply { + setDataAndType(uri, "application/vnd.android.package-archive") + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK) + } + val started = runCatching { context.startActivity(actionView) } + if (started.isFailure) { + val actionInstall = Intent(Intent.ACTION_INSTALL_PACKAGE).apply { setDataAndType(uri, "application/vnd.android.package-archive") addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK) } - runCatching { context.startActivity(intent) }.onFailure { e -> - _uiState.update { it.copy(phase = Phase.Error(e.message ?: "cannot start installer")) } + runCatching { context.startActivity(actionInstall) }.onFailure { e -> + _uiState.update { it.copy(phase = Phase.Error(e.message ?: "无法启动安装器")) } } - } else { - _uiState.update { it.copy(phase = Phase.NeedInstallPermission) } } } }