Capacitor Android 插件指南
为 Android 构建 Capacitor 插件需要编写 Java 或 Kotlin 代码来与 Android SDK 进行交互。
开始之前
首先,请按照插件指南的入门部分生成一个插件。
接下来,在 Android Studio 中打开 echo/android/ 目录。然后你需要找到插件的 .java 文件,具体路径取决于创建插件时使用的插件 ID 和插件类名。
例如,对于 ID 为 com.domain.echo、插件类名为 Echo 的插件,你可以在 android/src/main/java/com/domain/echo/EchoPlugin.java 找到对应的 .java 文件。
使用 Kotlin
Capacitor 默认使用 Java,但如果你愿意,也可以使用 Kotlin。
生成插件后,在 Android Studio 中右键点击 Java 插件类,从菜单中选择“将 Java 文件转换为 Kotlin 文件”选项。Android Studio 将引导你配置项目以支持 Kotlin。完成后,再次右键点击 Java 类并重新选择转换选项,将其转换为 Kotlin 类。
插件基础
Android 上的 Capacitor 插件是一个简单的 Java 类,它继承自 com.getcapacitor.Plugin 并带有 @CapacitorPlugin() 注解。
它包含一些带有 @PluginMethod() 注解的方法,这些方法可以从 JavaScript 调用。
生成插件后,你可以通过打开生成器中设置的插件类名对应的文件来开始编辑。
简单示例
在生成的示例中,有一个简单的 echo 插件,其中包含一个 echo 函数,它只是返回接收到的值。
这个示例展示了 Capacitor 插件的几个核心组件:从插件调用中接收数据,并将数据返回给调用者。
EchoPlugin.java
package android.plugin.test;
import com.getcapacitor.JSObject;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;
@CapacitorPlugin(name = "Echo")
public class EchoPlugin extends Plugin {
@PluginMethod()
public void echo(PluginCall call) {
String value = call.getString("value");
JSObject ret = new JSObject();
ret.put("value", value);
call.resolve(ret);
}
}
访问调用数据
每个插件方法都会接收到一个 com.getcapacitor.PluginCall 实例,其中包含了客户端调用插件方法的所有信息。
客户端可以发送任何可以 JSON 序列化的数据,例如数字、文本、布尔值、对象和数组。这些数据可以通过调用实例的 getData 字段访问,或使用便捷方法如 getString 或 getObject。
例如,以下是如何获取传递给方法的数据:
@PluginMethod()
public void storeContact(PluginCall call) {
String name = call.getString("yourName", "default name");
JSObject address = call.getObject("address", new JSObject());
boolean isAwesome = call.getBoolean("isAwesome", false);
if (!call.getData().has("id")) {
call.reject("必须提供 id");
return;
}
// ...
call.resolve();
}
注意访问 PluginCall 实例数据的各种方式,包括如何使用 getData 的 has 方法检查键是否存在。
返回数据
插件调用可以成功或失败。插件调用借鉴了 JavaScript Promise 的方法命名:调用 resolve() 表示成功(可选返回数据),使用 reject() 表示失败并附带错误信息。
PluginCall 的 resolve() 方法接受 JSObject 并支持 JSON 可序列化的数据类型。以下是将数据返回给客户端的示例:
JSObject ret = new JSObject();
ret.put("added", true);
JSObject info = new JSObject();
info.put("id", "unique-id-1234");
ret.put("info", info);
call.resolve(ret);
要失败或拒绝调用,请使用 call.reject,传入错误字符串,可选地还可以包含错误代码和 Exception 实例:
call.reject(exception.getLocalizedMessage(), null, exception);
持久化插件调用
在大多数情况下,插件方法被调用以执行任务后可以立即完成。但在某些情况下,你需要保持插件调用可用,以便稍后访问。你可能需要这样做来定期 返回数据(例如流式传输实时地理位置数据),或执行异步任务。
有关如何持久化插件调用的更多详细信息,请参阅保存插件调用指南。
在插件加载时运行代码
有时,插件可能需要在首次加载时运行一些代码。
为此,请为 load() 方法提供实现:
@Override
public void load() {
}