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 { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_17
} }
signingConfigs { signingConfigs {
@@ -93,4 +93,5 @@ flutter {
dependencies { dependencies {
implementation "androidx.activity:activity-ktx:1.9.2" 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"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </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. <!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data <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.ContentResolver
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Environment
import android.view.KeyEvent import android.view.KeyEvent
import androidx.documentfile.provider.DocumentFile
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel
@@ -13,8 +13,6 @@ import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant import io.flutter.plugins.GeneratedPluginRegistrant
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.InputStream
import java.io.OutputStream
import java.lang.Exception import java.lang.Exception
class MainActivity : FlutterActivity() { class MainActivity : FlutterActivity() {
@@ -27,15 +25,19 @@ class MainActivity : FlutterActivity() {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == pickDirectoryCode && resultCode == Activity.RESULT_OK) { if (requestCode == pickDirectoryCode) {
val pickedDirectoryUri = data?.getStringExtra("directoryUri") if(resultCode != Activity.RESULT_OK) {
result.success(null)
return
}
val pickedDirectoryUri = data?.data
if (pickedDirectoryUri == null) { if (pickedDirectoryUri == null) {
result.success(null) result.success(null)
return
} }
val uri = Uri.parse(pickedDirectoryUri)
Thread { Thread {
try { try {
result.success(onPickedDirectory(uri)) result.success(onPickedDirectory(pickedDirectoryUri))
} }
catch (e: Exception) { catch (e: Exception) {
result.error("Failed to Copy Files", e.toString(), null) result.error("Failed to Copy Files", e.toString(), null)
@@ -63,7 +65,8 @@ class MainActivity : FlutterActivity() {
} }
"getDirectoryPath" -> { "getDirectoryPath" -> {
this.result = res 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) startActivityForResult(intent, pickDirectoryCode)
} }
else -> res.notImplemented() else -> res.notImplemented()
@@ -116,36 +119,34 @@ class MainActivity : FlutterActivity() {
/// copy the directory to tmp directory, return copied directory /// copy the directory to tmp directory, return copied directory
private fun onPickedDirectory(uri: Uri): String { private fun onPickedDirectory(uri: Uri): String {
val tempDir = File(context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "tempDir") val contentResolver = context.contentResolver
if (!tempDir.exists()) { var tmp = context.cacheDir
tempDir.mkdirs() tmp = File(tmp, "getDirectoryPathTemp")
tmp.mkdir()
copyDirectory(contentResolver, uri, tmp)
return tmp.absolutePath
} }
val contentResolver: ContentResolver = context.contentResolver private fun copyDirectory(resolver: ContentResolver, srcUri: Uri, destDir: File) {
val src = DocumentFile.fromTreeUri(context, srcUri) ?: return
val childrenUri = Uri.withAppendedPath(uri, "children") for (file in src.listFiles()) {
if(file.isDirectory) {
contentResolver.query(childrenUri, null, null, null, null)?.use { cursor -> val newDir = File(destDir, file.name!!)
while (cursor.moveToNext()) { newDir.mkdir()
val documentId = cursor.getString(cursor.getColumnIndexOrThrow("_id")) copyDirectory(resolver, file.uri, newDir)
val fileUri = Uri.withAppendedPath(uri, documentId) } else {
val newFile = File(destDir, file.name!!)
// 复制文件 val inputStream = resolver.openInputStream(file.uri) ?: return
val inputStream: InputStream? = contentResolver.openInputStream(fileUri) val outputStream = FileOutputStream(newFile)
val outputStream: OutputStream = FileOutputStream(File(tempDir, documentId)) inputStream.copyTo(outputStream)
inputStream.close()
inputStream?.use { input -> outputStream.close()
outputStream.use { output ->
input.copyTo(output)
} }
} }
} }
} }
return tempDir.absolutePath
}
}
class VolumeListen{ class VolumeListen{
var onUp = fun() {} var onUp = fun() {}
var onDown = fun() {} var onDown = fun() {}

View File

@@ -19,7 +19,7 @@ pluginManagement {
plugins { plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version '8.2.1' apply false 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" include ":app"