当前位置: 首页 > 知识库问答 >
问题:

带Kotlin的Android文件复制Flutter插件

卞昀
2023-03-14

尝试创建一个Flutter插件,将资产文件复制到本机应用程序文档文件夹。

对于iOS,我通过以下代码实现了这一点(见下文)。

不过,由于我对Android架构了解不多,我想知道我的Android MethodChannel代码应该是什么样子的。

我的Android部分这个Flutter插件需要在KOTLIN!

我需要一个文件副本从Android资产文件夹到Android的文档文件夹-所有这些都在Flutter插件和Kotlin中完成!

再说一遍,我已经准备好了Swift的iOS。缺少的是Kotlin计数器部分的Android。这件事你有什么帮助吗?

.

以下是Swift中iOS FlutterMethodChannel的工作代码

(即它将一个文件从main-bundle复制到iPhone的Documents-Directory...)

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个答案

羿经武
2023-03-14

我终于找到了一个解决文件复制问题的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)
        }
      }
    }
 类似资料:
  • 我在我的android项目中添加了两个库,它们被称为: 我在中将它们定义为: null

  • 是否有人使用cloud_firestore插件成功地运行了事务?我得到以下错误: E/AndroidRuntime(26208):致命异常:AsyncTask#2 E/AndroidRuntime(26208):process:io.flutter.plugins.googleSigninexample,PID:26208 E/AndroidRuntime(26208):java.lang.run

  • 我是新的Gradle,但需要建立一个开源项目,使用它,从我的机器上的公司网络。该项目最近转移到静态编程语言DSL,因此需要一些插件。 我需要使用我们的corporate Nexus服务器获取插件依赖项,我希望全局设置,因为我不想修改在所有项目中(我已经尝试过了,而且效果很好) 如果我想在全球范围内这样做,我从https://docs.gradle.org/current/userguide/plu

  • 下面是Gradle Build的stacktrace: Build.Gradle看起来是这样的: 编辑1:从META-INF目录中的httpmime库的本地副本中删除我有问题的文件,成功解决了此问题

  • 现在我正在编写一个maven依赖项a,并在项目B中使用这个依赖项。两者的文件结构都是: 依赖A: 项目B: 我想做的是当我运行mvn spring boot时:在项目B中运行,测试。A的src/main/resources/files中的txt将被复制到项目B的/WebContent中。 我尝试在依赖项A中编写以下代码: 但是当我执行mvn spring boot:run时,它说文件不存在。

  • 我正在尝试运行我的项目,它运行没有任何问题,但在我更新Android Studio后…我有一个错误,我不知道我使用了哪个android studio版本之前,更新降级到它。 Android Gradle插件只支持Kotlin Gradle插件1.3.0及更高版本。以下依赖项不满足所需版本:项目':assets_audio_player'->org.jetbrains.kotlin:kotlin-g