fix android

This commit is contained in:
nyne
2024-09-30 15:04:47 +08:00
parent 932e0c3896
commit a8782b5ce0
5 changed files with 36 additions and 72 deletions

View File

@@ -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'
}

View File

@@ -25,12 +25,6 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".DirectoryPickerActivity"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data

View File

@@ -1,32 +0,0 @@
package com.github.wgh136.venera
import android.app.Instrumentation
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
class DirectoryPickerActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
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)
resultLauncher.launch(intent)
}
private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
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()
}
}

View File

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