1 概述
android-non-root-demo 工程演示了如何使用 Xvisio Android SDK(APK版本)开发 Android apk 应用程序。
2 构建和运行
2.1 环境搭建
1. 首先需要在 Linux/Windows 主机上安装 Android Studio。点击此处下载。
2. 启动 Android Studio 打开 SDK Manager 安装最新的 Android SDK 和 NDK 。
3. 从 Github 下载最新的 android-non-root-demo 工程。
4. 查看 android-non-root-demo 工程的版本, android-non-root-demo/xvsdk/build.gradle
defaultConfig { versionCode 3xxx versionName "3.x.x-xxxxxxxx"
5. 获取最新SDK安装包: 请选择下载包含有"xvsdk_3.x.x-xxxxxxx_android_apk.zig"字样的压缩包。
6. 解压缩SDK安装包 "xvsdk_3.x.x-xxxxxxx_android_apk.zig",并将 SDK 压缩包中的文件复制到 android-non-root-demo 工程中替换最新SDK。文件路径:android-non-root-demo/xvsdk/src/main/cpp/xvsdk/,替换后 SDK 目录如下:
android-non-root-demo/xvsdk/src/main/cpp/xvsdk
├── android
├── bin
├── doc
├── examples
├── include
├── include2
├── libs
├── unity-wrapper
├── ChangeLog
├── deploy-arm64-v8a.sh
├── deploy-armeabi-v7a.sh
├── deploy-x86_64.sh
└── README.md
2.2 编译运行
1. 启动 Android Studio 打开 android-non-root-demo 工程。
2. Build->Make Project 编译工程,编译完成后 Run->Run 'app' 安装 apk。
3. 使用USB连接 XVisio 设备和 android 设备,连接成功后,android 设备会弹出USB设备选择对话框,见下图:
选择 xslam 打开应用程序。
3 代码介绍
3.1 工程目录
android-non-root-demo
├── app -- 主界面模块
├── landmode -- 横屏模式模块
└── xvsdk/src/main -- xvsdk 模块
├── cpp
│ ├── wrapper -- xvsdk JNI 接口
│ └── xvsdk -- Xvisio Android SDK(APK版本)
└── java -- xvsdk java 接口
3.2 主要文件
| 文件 | 描述 |
| xslam_android.cpp | xvsdk JNI 接口封装文件 |
| XCamera.java | xvsdk java 接口类 |
| ImuListener.java | IMU 数据回调接口 |
| PoseListener.java | 6DOF 数据回调接口 |
| RgbListener.java | RGB 相机数据回调接口 |
| TofListener.java | TOF 深度数据回调接口 |
| TofIrListener.java | TOF IR 深度数据回调接口 |
| StereoListener.java | 双目鱼眼相机数据回调接口 |
| SgbmListener.java | Sgbm 深度数据回调接口 |
3.3 代码解析和介绍
1. 在 AndroidManifest.xml 文件添加权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.USB_PERMISSION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.usb.host" />
<uses-feature android:name="android.hardware.camera" />
2. 在 AndroidManifest.xml 文件为主 Activity 添加 USB 设备监听配置:
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/usb_filter" />
3. 初始化 sdk 注册设备连接回调:
XCamera mCamera = new XCamera();
mCamera.init(mAppContext);
mCamera.setDevicesChangedCallback(mListener);
4. 获取 IMU 数据:
ImuListener mImuListener = new ImuListener() {
@Override
public void onImu(double x, double y, double z) {
}
};
mCamera.setImuCallback(mImuListener);
mCamera.startStream(XCamera.Stream.IMU);
5. 获取 SLAM 6DOF 数据:
PoseListener mPoseListener = new PoseListener() {
@Override
public void onPose(double x, double y, double z, double pitch, double yaw, double roll) {
}
};
mCamera.setPoseCallback(mPoseListener);
mCamera.startStream(XCamera.Stream.SLAM);
6. 获取 RGB 相机数据:
RgbListener mRgbListener = new RgbListener() {
@Override
public void onFps(int fps) {
}
@Override
public void onRgb(int width, int height, int[] pixels) {
}
};
mCamera.setRgbCallback(mRgbListener);
mCamera.startStream(XCamera.Stream.RGB);
7. 获取 TOF 相机数据:
TofListener mTofListener = new TofListener() {
@Override
public void onTof(int width, int height, int[] pixels) {
}
};
TofListener mTofIrListener = new TofIrListener() {
@Override
public void onTofIr(int width, int height, int[] pixels) {
}
};
mCamera.setTofCallback(mTofListener);
mCamera.setTofIrCallback(mTofIrListener);
mCamera.startStream(XCamera.Stream.TOF);
8. 获取鱼眼相机数据:
StereoListener mStereoListener = new StereoListener() {
@Override
public void onStereo(int width, int height, int[] pixels) {
}
};
mCamera.setStereoCallback(mStereoListener);
mCamera.startStream(XCamera.Stream.STEREO);
9. 获取 SGBM 数据:
SgbmListener mSgbmListener = new SgbmListener() {
@Override
public void onSgbm(int width, int height, int[] pixels) {
}
};
mCamera.setSgbmCallback(mSgbmListener);
mCamera.startStream(XCamera.Stream.SGBM);