Android 实现
插件的开发已接近完成,接下来只需完成 Android 端的实现!
向 Capacitor 注册插件
前提条件: 继续之前请先熟悉 Capacitor 自定义原生 Android 代码文档。
通过运行 npx cap open android
在 Android Studio 中打开 Capacitor 应用的 Android 项目。展开 app 模块和 java 文件夹,右键点击应用的 Java 包。从上下文菜单中选择 New -> Package,创建一个名为 plugins 的子包。右键点击 plugins 包,重复前述过程创建名为 ScreenOrientation 的子包。
接着,右键点击 ScreenOrientation 包,通过选择 New -> Java File 从上下文菜单中添加新的 Java 文件。将此文件命名为 ScreenOrientationPlugin.java
。重复此过程创建另一个名为 ScreenOrientation.java
的文件。
将以下代码复制到 ScreenOrientationPlugin.java
中:
package io.ionic.cap.plugin.plugins.ScreenOrientation;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;
@CapacitorPlugin(name = "ScreenOrientation")
public class ScreenOrientationPlugin extends Plugin {
@PluginMethod()
public void orientation(PluginCall call) {
call.resolve();
}
@PluginMethod()
public void lock(PluginCall call) {
call.resolve();
}
@PluginMethod()
public void unlock(PluginCall call) {
call.resolve();
}
}
在项目的 MainActivity 中注册插件类,以桥接 Java 和 JavaScript。打开 MainActivity.java
,添加一个 onCreate()
方法来注册插件:
package io.ionic.cap.plugin;
import android.os.Bundle;
import com.getcapacitor.BridgeActivity;
import io.ionic.cap.plugin.plugins.ScreenOrientation.ScreenOrientationPlugin;
public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
registerPlugin(ScreenOrientationPlugin.class);
super.onCreate(savedInstanceState);
}
}
获取当前屏幕方向
与 iOS 类似,我们将首先处理获取当前屏幕方向。打开 ScreenOrientation.java
来设置类并编写获取当前方向的方法:
package io.ionic.cap.plugin.plugins.ScreenOrientation;
import android.view.Surface;
import androidx.appcompat.app.AppCompatActivity;
public class ScreenOrientation {
private AppCompatActivity activity;
public ScreenOrientation(AppCompatActivity activity) {
this.activity = activity;
}
public String getCurrentOrientationType() {
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
return fromRotationToOrientationType(rotation);
}
private String fromRotationToOrientationType(int rotation) {
switch (rotation) {
case Surface.ROTATION_90:
return "landscape-primary";
case Surface.ROTATION_180:
return "portrait-secondary";
case Surface.ROTATION_270:
return "landscape-secondary";
default:
return "portrait-primary";
}
}
}
接下来,在 ScreenOrientationPlugin.java
中连接 orientation
方法,调用实现类的方法:
package io.ionic.cap.plugins.ScreenOrientation;
import com.getcapacitor.JSObject;
/* 其余导入为了简洁省略 */
@CapacitorPlugin(name = "ScreenOrientation")
public class ScreenOrientationPlugin extends Plugin {
private ScreenOrientation implementation;
@Override
public void load() {
implementation = new ScreenOrientation(getActivity());
}
@PluginMethod()
public void orientation(PluginCall call) {
JSObject ret = new JSObject();
String type = implementation.getCurrentOrientationType();
ret.put("type", type);
call.resolve(ret);
}
/* 其余代码为了简洁省略 */
}
load()
方法是使用 Capacitor 桥接对象初始化 ScreenOrientation
类实例的合适位置 。
在 Android Studio 中运行应用,可以在真实设备或 Android 模拟器上运行。打开 Logcat,你应该能看到调用日志:
V/Capacitor/Plugin: To native (Capacitor plugin): callbackId: 89582874, pluginId: ScreenOrientation, methodName: orientation
注意: 日志的确切值会有所不同。在此示例中,
89582874
是分配给插件方法调用的任意 ID。
监听屏幕方向变化
Android 将设备旋转视为运行时配置更改,因此我们的插件需要一种方式来处理配置更改。
Capacitor 提供了一个可重写的方法 handleOnConfigurationChanged()
,可用于响应运行时配置更改。
首先在 ScreenOrientationPlugin
类中添加以下导入:
import android.content.res.Configuration;
然后在 ScreenOrientationPlugin
类中添加以下方法:
@Override
public void handleOnConfigurationChanged(Configuration newConfig) {
super.handleOnConfigurationChanged(newConfig);
this.onOrientationChanged();
}
private void onOrientationChanged() {
JSObject ret = new JSObject();
String type = implementation.getCurrentOrientationType();
ret.put("type", type);
notifyListeners("screenOrientationChange", ret);
}