Capacitor Android 插件指南
为 Android 构建 Capacitor 插件需要使用 Java 或 Kotlin 与 Android SDK 进行交互。
开始使用
首先,按照插件指南的 开始使用 部分生成一个插件。
接着,在 Android Studio 中打开 echo/android/ 目录。然后你需要找到插件的 .java 文件,具体路径取决于创建插件时使用的 Plugin ID 和 Plugin Class Name。
例如,对于 ID 为 com.domain.echo 且 Plugin Class Name 为 Echo 的插件,你可以在 android/src/main/java/com/domain/echo/EchoPlugin.java 找到 .java 文件。
使用 Kotlin
Capacitor 默认使用 Java,但如果你喜欢,也可以使用 Kotlin。
生成插件后,在 Android Studio 中右键点击 Java 插件类,从菜单中选择“Convert Java file to Kotlin file”选项。Android Studio 会引导你配置项目以支持 Kotlin。完成后,再次右键点击 Java 类,重新选择转换选项将其转换为 Kotlin 类。
插件基础
Android 的 Capacitor 插件是一个简单的 Java 类,它继承自 com.getcapacitor.Plugin 并带有 @CapacitorPlugin() 注解。该类包含一些带有 @PluginMethod() 注解的方法,这些方法可以从 JavaScript 调用。
生成插件后,你可以通过打开生成器中选择的 Plugin 类名对应的文件来开始编辑。
简单示例
在生成的示例中,有一个简单的 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() {
}