From a8782b5ce040d8a3687ed8f9b8fb87ec84b59dc1 Mon Sep 17 00:00:00 2001 From: nyne Date: Mon, 30 Sep 2024 15:04:47 +0800 Subject: [PATCH] fix android --- android/app/build.gradle | 5 +- android/app/src/main/AndroidManifest.xml | 6 -- .../wgh136/venera/DocumentPickActivity.kt | 32 ---------- .../com/github/wgh136/venera/MainActivity.kt | 63 ++++++++++--------- android/settings.gradle | 2 +- 5 files changed, 36 insertions(+), 72 deletions(-) delete mode 100644 android/app/src/main/kotlin/com/github/wgh136/venera/DocumentPickActivity.kt diff --git a/android/app/build.gradle b/android/app/build.gradle index 3eb1ef6..6469d19 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -40,8 +40,8 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } signingConfigs { @@ -93,4 +93,5 @@ flutter { dependencies { implementation "androidx.activity:activity-ktx:1.9.2" + implementation 'androidx.documentfile:documentfile:1.0.1' } \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 53dc21d..952953d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -25,12 +25,6 @@ - - val returnIntent = Intent() - if (result.resultCode == RESULT_OK) { - val uri: Uri? = result.data?.data - if (uri != null) { - contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - returnIntent.putExtra("directoryUri", uri.toString()) - } - } - setResult(RESULT_OK, returnIntent) - finish() - } -} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt b/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt index c325ada..ef03f57 100644 --- a/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt +++ b/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt @@ -4,8 +4,8 @@ import android.app.Activity import android.content.ContentResolver import android.content.Intent import android.net.Uri -import android.os.Environment import android.view.KeyEvent +import androidx.documentfile.provider.DocumentFile import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.EventChannel @@ -13,8 +13,6 @@ import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.GeneratedPluginRegistrant import java.io.File import java.io.FileOutputStream -import java.io.InputStream -import java.io.OutputStream import java.lang.Exception class MainActivity : FlutterActivity() { @@ -27,15 +25,19 @@ class MainActivity : FlutterActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == pickDirectoryCode && resultCode == Activity.RESULT_OK) { - val pickedDirectoryUri = data?.getStringExtra("directoryUri") + if (requestCode == pickDirectoryCode) { + if(resultCode != Activity.RESULT_OK) { + result.success(null) + return + } + val pickedDirectoryUri = data?.data if (pickedDirectoryUri == null) { result.success(null) + return } - val uri = Uri.parse(pickedDirectoryUri) Thread { try { - result.success(onPickedDirectory(uri)) + result.success(onPickedDirectory(pickedDirectoryUri)) } catch (e: Exception) { result.error("Failed to Copy Files", e.toString(), null) @@ -63,7 +65,8 @@ class MainActivity : FlutterActivity() { } "getDirectoryPath" -> { this.result = res - val intent = Intent(this, DirectoryPickerActivity::class.java) + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) startActivityForResult(intent, pickDirectoryCode) } else -> res.notImplemented() @@ -116,33 +119,31 @@ class MainActivity : FlutterActivity() { /// copy the directory to tmp directory, return copied directory private fun onPickedDirectory(uri: Uri): String { - val tempDir = File(context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "tempDir") - if (!tempDir.exists()) { - tempDir.mkdirs() - } + val contentResolver = context.contentResolver + var tmp = context.cacheDir + tmp = File(tmp, "getDirectoryPathTemp") + tmp.mkdir() + copyDirectory(contentResolver, uri, tmp) - val contentResolver: ContentResolver = context.contentResolver + return tmp.absolutePath + } - val childrenUri = Uri.withAppendedPath(uri, "children") - - contentResolver.query(childrenUri, null, null, null, null)?.use { cursor -> - while (cursor.moveToNext()) { - val documentId = cursor.getString(cursor.getColumnIndexOrThrow("_id")) - val fileUri = Uri.withAppendedPath(uri, documentId) - - // 复制文件 - val inputStream: InputStream? = contentResolver.openInputStream(fileUri) - val outputStream: OutputStream = FileOutputStream(File(tempDir, documentId)) - - inputStream?.use { input -> - outputStream.use { output -> - input.copyTo(output) - } - } + private fun copyDirectory(resolver: ContentResolver, srcUri: Uri, destDir: File) { + val src = DocumentFile.fromTreeUri(context, srcUri) ?: return + for (file in src.listFiles()) { + if(file.isDirectory) { + val newDir = File(destDir, file.name!!) + newDir.mkdir() + copyDirectory(resolver, file.uri, newDir) + } else { + val newFile = File(destDir, file.name!!) + val inputStream = resolver.openInputStream(file.uri) ?: return + val outputStream = FileOutputStream(newFile) + inputStream.copyTo(outputStream) + inputStream.close() + outputStream.close() } } - - return tempDir.absolutePath } } diff --git a/android/settings.gradle b/android/settings.gradle index f4d9899..0d0d669 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,7 +19,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version '8.2.1' apply false - id "org.jetbrains.kotlin.android" version "1.7.10" apply false + id "org.jetbrains.kotlin.android" version "1.8.10" apply false } include ":app"