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 @@
+
+
+
+