Плагин для копирования файлов в Android с Kotlin - PullRequest
0 голосов
/ 11 января 2019

Попытка создать плагин 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);
    }
}

1 Ответ

0 голосов
/ 15 января 2019

Я наконец-то нашел решение проблемы копирования файлов в Kotlin!

Это было особенно полезно в создании моего самого первого плагина Flutter.

Вот решение файла-копии в Kotlin

    import java.io.File
    import java.io.InputStream
    import io.flutter.util.PathUtils

    private fun copyFile(fileName: String): String {

      val assetStream: InputStream = mRegistrar.context().assets.open(fileName)
      val appliationDocumentsFolderPath: String = PathUtils.getDataDirectory(mRegistrar.context())
      val outputFilePath: String = appliationDocumentsFolderPath + "/" + fileName

      if (!File(outputFilePath).exists()) {
        File(outputFilePath).copyInputStreamToFile(assetStream)   
      }
      return outputFilePath
    }

    private fun File.copyInputStreamToFile(inputStream: InputStream) {
      inputStream.use { input ->
        this.outputStream().use { fileOut ->
          input.copyTo(fileOut)
        }
      }
    }
...