Попытка создать плагин Flutter, который копирует файл ресурса в собственную папку документов приложений.
Для iOS я добился этого с помощью следующего кода (см. Ниже).
Однако, поскольку я не очень разбираюсь в архитектуре Android, я хотел бы знать, как должен выглядеть мой код Android MethodChannel.
Моя Android-часть этого плагина Flutter должна быть в KOTLIN!
Мне нужна копия файла из папки ресурсов Android в папку документов Android - все это делается внутри плагина Flutter и в Kotlin!
Опять же, у меня есть готовая iOS в Swift. Чего не хватает, так это контратаки Android в Kotlin. У вас есть помощь по этому вопросу?
.
Вот рабочий код для iOS FlutterMethodChannel в Swift:
(т. Е. Он копирует файл из основного комплекта в каталог документов iPhone ...)
import UIKit
private func copyFile(fileName: String) -> String {
let fileManager = FileManager.default
let documentsUrl = fileManager.urls(for: .documentDirectory,
in: .userDomainMask)
guard documentsUrl.count != 0 else {
return "Could not find documents URL"
}
let finalURL = documentsUrl.first!.appendingPathComponent(fileName)
if !( (try? finalURL.checkResourceIsReachable()) ?? false) {
let documentsURL = Bundle.main.resourceURL?.appendingPathComponent(fileName)
do {
try fileManager.copyItem(atPath: (documentsURL?.path)!, toPath: finalURL.path)
return "\(finalURL.path)"
} catch let error as NSError {
return "Couldn't copy file to final location! Error:\(error.description)"
}
} else {
return "\(finalURL.path)"
}
}
В Kotlin я пробовал это - но это не работает вообще ....: (
import java.io.File
private fun copyFileTrial1(fileName: String): String {
File src = new File("../../assets/${fileName}");
File dst = new File("../../DocumentsFolder/${fileName}", src.getName());
FileInputStream inStream = new FileInputStream(src);
FileOutputStream outStream = new FileOutputStream(dst);
FileChannel inChannel = inStream.getChannel();
FileChannel outChannel = outStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inStream.close();
outStream.close();
return "hello1"
}
Или я попробовал это - но снова - совершенно безуспешно: (
private fun copyFileTrial2(fileName: String): String {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(fileName);
String outDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/X/Y/Z/" ;
File outFile = new File(outDir, filenfileNameame);
out = new FileOutputStream(outFile);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(IOException e) {
Log.e("tag", "Failed to copy asset file: " + fileName, e);
}
return "hello2"
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}