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 插件类,然后从菜单中选择"Convert Java file to Kotlin file"选项。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("Must provide an id");
return;
}
// ...
call.resolve();
}
注意在 PluginCall 实例上访问数据的各种方 式,包括如何使用 getData 的 has 方法检查键。
返回数据
插件调用可以成功或失败。插件调用借鉴了 JavaScript promises 的方法名称:调用 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() {
}
权限
如果你的插件在 Android 上具有需要最终用户许可的功能,则需要实现权限模式。
在继续本节之前,请确保你已设置权限别名和状态接口。如果没有,请参阅 Web 指南中的权限部分。
注解更改
仍在使用
@NativePlugin? 请参阅升级指南切换到@CapacitorPlugin。
@CapacitorPlugin(
name = "FooBar",
+ permissions = {
+ @Permission(
+ alias = "camera",
+ strings = { Manifest.permission.CAMERA }
+ ),
+ @Permission(
+ alias = "storage",
+ strings = {
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ }
+ )
+ }
)
public class FooBarPlugin extends Plugin {
...
在 @CapacitorPlugin 注解中添加 permissions 属性,它是一个或多个 @Permission 注解的数组。每个 @Permission 注解包含零个或多个 Android 权限 strings 和一个描述用途的简短 alias。
按插件的不同功能对每个 @Permission 中的权限字符串进行分组。如果你的插件在其他平台上需要权限但在 Android 上不需要,则使用相同的别名定义权限,但对于 strings 使用空数组。这将导致权限请求的结果自动为该权限别名返回"granted"。
@Permission(
alias = "notifications",
strings = {}
)