mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 07:47:24 +00:00
fix android
This commit is contained in:
@@ -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'
|
||||
}
|
@@ -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
|
||||
|
@@ -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()
|
||||
}
|
||||
}
|
@@ -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,34 +119,32 @@ 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)
|
||||
|
||||
return tmp.absolutePath
|
||||
}
|
||||
|
||||
val contentResolver: ContentResolver = context.contentResolver
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
class VolumeListen{
|
||||
|
@@ -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"
|
||||
|
Reference in New Issue
Block a user