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 {
|
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'
|
||||||
}
|
}
|
@@ -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
|
||||||
|
@@ -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.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,33 +119,31 @@ 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)
|
||||||
|
|
||||||
val contentResolver: ContentResolver = context.contentResolver
|
return tmp.absolutePath
|
||||||
|
}
|
||||||
|
|
||||||
val childrenUri = Uri.withAppendedPath(uri, "children")
|
private fun copyDirectory(resolver: ContentResolver, srcUri: Uri, destDir: File) {
|
||||||
|
val src = DocumentFile.fromTreeUri(context, srcUri) ?: return
|
||||||
contentResolver.query(childrenUri, null, null, null, null)?.use { cursor ->
|
for (file in src.listFiles()) {
|
||||||
while (cursor.moveToNext()) {
|
if(file.isDirectory) {
|
||||||
val documentId = cursor.getString(cursor.getColumnIndexOrThrow("_id"))
|
val newDir = File(destDir, file.name!!)
|
||||||
val fileUri = Uri.withAppendedPath(uri, documentId)
|
newDir.mkdir()
|
||||||
|
copyDirectory(resolver, file.uri, newDir)
|
||||||
// 复制文件
|
} else {
|
||||||
val inputStream: InputStream? = contentResolver.openInputStream(fileUri)
|
val newFile = File(destDir, file.name!!)
|
||||||
val outputStream: OutputStream = FileOutputStream(File(tempDir, documentId))
|
val inputStream = resolver.openInputStream(file.uri) ?: return
|
||||||
|
val outputStream = FileOutputStream(newFile)
|
||||||
inputStream?.use { input ->
|
inputStream.copyTo(outputStream)
|
||||||
outputStream.use { output ->
|
inputStream.close()
|
||||||
input.copyTo(output)
|
outputStream.close()
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return tempDir.absolutePath
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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"
|
||||||
|
Reference in New Issue
Block a user