如何*准确*从Android Java*插件*平台代码中访问Flutter资产



我们想要定义一个Flutter资产,该资产可以在同一插件内从Android平台代码访问。这方面的文件据称就在这里。

请注意,我们不是在谈论flutter应用程序中的自定义平台代码——我们是从插件作者的角度来谈论flutter插件代码。

因此,在文档之后,我们从插件的pubspec.yaml文件开始,该文件存在于[your_plugin_root_dir]\pubspec.yaml中,并添加了资产定义:

assets:
- assets/sound.wav

这指向[your_plugin_root_dir]\assets\sound.wav 中的现有文件

到目前为止一切都很好,但我们有一个问题:

当你在Android studio中创建一个新的Flutter插件项目时,该插件的Android Java文件如下所示:

public class PluginTestPlugin implements FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private MethodChannel channel;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "plugin_test");
channel.setMethodCallHandler(this);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
}

为了从该代码中访问您的资产,文档建议添加以下代码:

AssetManager assetManager = registrar.context().getAssets();
String key = registrar.lookupKeyForAsset("assets/sound.wav");
AssetFileDescriptor fd = assetManager.openFd(key);

但由于没有";注册员";实例,而文档没有描述它是如何创建的,也没有描述如何访问它,我迷失了方向

我在这里错过了什么????

在方法通道旁边添加另一个字段,以保持绑定;

private MethodChannel channel;
private FlutterPluginBinding binding;

onAttachedToEngine中设置它:

channel.setMethodCallHandler(this);
binding = flutterPluginBinding;

并在onDetached中清除

channel.setMethodCallHandler(null);
binding = null;

然后像这样使用它(为此,我向名为assets/foo.bin的插件(而不是示例应用程序(添加了一个资产,我的插件名称是plugin1(

String assetPath = binding
.getFlutterAssets()
.getAssetFilePathBySubpath("assets/foo.bin", "plugin1");
try {
InputStream is = binding.getApplicationContext().getAssets().open(assetPath);
// todo - read the asset into memory or whatever
is.close();
} catch (IOException e) {
Log.e("plugin1", e.getMessage());
}

插件项目的pubspec.yaml需要额外的行来打包资产,如下所示,在plugin部分之后:

plugin:
platforms:
android:
package: io.swhh.plugin1
pluginClass: Plugin1Plugin
ios:
pluginClass: Plugin1Plugin
assets:
- assets/foo.bin

你可能对iOS中的同类产品感兴趣(请原谅缺乏错误处理(

let key = FlutterDartProject.lookupKey(forAsset: "assets/foo.bin", fromPackage: "plugin1")
let path = Bundle.main.path(forResource: key, ofType: nil, inDirectory: nil)
let url = URL(fileURLWithPath: path!)
// use url to load the resource

最新更新