- Native ApkInstallerModule: FileProvider content:// URI for Android 7+ - REQUEST_INSTALL_PACKAGES permission in AndroidManifest - file_paths.xml for FileProvider cache access - APP_VERSION reads from package.json (not hardcoded) - "Auf Updates pruefen" button in Settings - Version display reads from package.json dynamically Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
45 lines
1.5 KiB
Kotlin
45 lines
1.5 KiB
Kotlin
package com.ariacockpit
|
|
|
|
import android.content.Intent
|
|
import android.net.Uri
|
|
import android.os.Build
|
|
import androidx.core.content.FileProvider
|
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
import com.facebook.react.bridge.ReactMethod
|
|
import com.facebook.react.bridge.Promise
|
|
import java.io.File
|
|
|
|
class ApkInstallerModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
|
override fun getName() = "ApkInstaller"
|
|
|
|
@ReactMethod
|
|
fun install(filePath: String, promise: Promise) {
|
|
try {
|
|
val file = File(filePath)
|
|
if (!file.exists()) {
|
|
promise.reject("FILE_NOT_FOUND", "APK nicht gefunden: $filePath")
|
|
return
|
|
}
|
|
|
|
val context = reactApplicationContext
|
|
val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file)
|
|
} else {
|
|
Uri.fromFile(file)
|
|
}
|
|
|
|
val intent = Intent(Intent.ACTION_VIEW).apply {
|
|
setDataAndType(uri, "application/vnd.android.package-archive")
|
|
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
|
}
|
|
|
|
context.startActivity(intent)
|
|
promise.resolve(true)
|
|
} catch (e: Exception) {
|
|
promise.reject("INSTALL_ERROR", e.message, e)
|
|
}
|
|
}
|
|
}
|