diff --git a/packages/client-android/android/.gradle/8.10.2/checksums/checksums.lock b/packages/client-android/android/.gradle/8.10.2/checksums/checksums.lock index 6bf444a..464494c 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/checksums/checksums.lock and b/packages/client-android/android/.gradle/8.10.2/checksums/checksums.lock differ diff --git a/packages/client-android/android/.gradle/8.10.2/checksums/md5-checksums.bin b/packages/client-android/android/.gradle/8.10.2/checksums/md5-checksums.bin index 102f0ca..9867591 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/checksums/md5-checksums.bin and b/packages/client-android/android/.gradle/8.10.2/checksums/md5-checksums.bin differ diff --git a/packages/client-android/android/.gradle/8.10.2/checksums/sha1-checksums.bin b/packages/client-android/android/.gradle/8.10.2/checksums/sha1-checksums.bin index c74293b..1c59e12 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/checksums/sha1-checksums.bin and b/packages/client-android/android/.gradle/8.10.2/checksums/sha1-checksums.bin differ diff --git a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin index b54a479..af91b64 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin and b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin differ diff --git a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock index 0c071bf..c56b455 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock and b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock differ diff --git a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin index 04e3d2e..c1f25f7 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin and b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin differ diff --git a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock index a589ab8..acb6ebe 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock and b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock differ diff --git a/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin b/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin index 4b0341d..aba4294 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin and b/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin differ diff --git a/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 6f2128f..47adbba 100644 Binary files a/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/packages/client-android/android/.gradle/file-system.probe b/packages/client-android/android/.gradle/file-system.probe index bdc380b..df111e1 100644 Binary files a/packages/client-android/android/.gradle/file-system.probe and b/packages/client-android/android/.gradle/file-system.probe differ diff --git a/packages/client-android/android/app/build.gradle b/packages/client-android/android/app/build.gradle index d65ee49..8dd38fe 100644 --- a/packages/client-android/android/app/build.gradle +++ b/packages/client-android/android/app/build.gradle @@ -35,5 +35,6 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:2.0.21" implementation "androidx.appcompat:appcompat:1.7.0" + implementation "androidx.core:core:1.15.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0" } diff --git a/packages/client-android/android/app/src/main/AndroidManifest.xml b/packages/client-android/android/app/src/main/AndroidManifest.xml index da70e39..3ce9a10 100644 --- a/packages/client-android/android/app/src/main/AndroidManifest.xml +++ b/packages/client-android/android/app/src/main/AndroidManifest.xml @@ -19,5 +19,15 @@ + + + + diff --git a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt index a6d615a..fab6224 100644 --- a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt +++ b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt @@ -19,6 +19,7 @@ import java.net.HttpURLConnection import java.net.URL import java.security.MessageDigest import android.util.Log +import androidx.core.content.FileProvider import org.json.JSONObject class MainActivity : AppCompatActivity() { @@ -210,44 +211,12 @@ class MainActivity : AppCompatActivity() { } private fun installApk(apkFile: File) { - if (!packageManager.canRequestPackageInstalls()) { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = Uri.parse("package:$packageName") - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } - startActivity(intent) - throw SecurityException("请开启安装未知应用权限后重试") - } - val packageInstaller = packageManager.packageInstaller - val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) - val sessionId = packageInstaller.createSession(params) - val session: PackageInstaller.Session - try { - session = packageInstaller.openSession(sessionId) - } catch (e: Exception) { - packageInstaller.abandonSession(sessionId) - throw e - } - try { - apkFile.inputStream().use { input -> - session.openWrite("package", 0, apkFile.length()).use { output -> - input.copyTo(output) - session.fsync(output) - } - } - val launchIntent = packageManager.getLaunchIntentForPackage(packageName) - ?: throw Exception("无法获取启动Intent") - val pendingIntent = PendingIntent.getActivity( - this, 0, launchIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - session.commit(pendingIntent.intentSender) - } catch (e: Exception) { - session.abandon() - throw e - } finally { - session.close() + val uri = FileProvider.getUriForFile(this, "${packageName}.fileprovider", apkFile) + val intent = 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) } + startActivity(intent) } private fun computeSha256(file: File): String { diff --git a/packages/client-android/android/app/src/main/res/xml/file_paths.xml b/packages/client-android/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..2f50ff3 --- /dev/null +++ b/packages/client-android/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,4 @@ + + + +