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"