[05/09/2019][v1.1.2] Include USBSerial to provide better stability of connectivity and other hotfixes.
[28/05/2019][v1.1.1] Fix Camera Preview Issues and Added Audio Support.
[26/03/2019][v1.0.0] First launch.
Date | X5S-SDK (.aar) | UVCCamera (.aar) | USBSerial (.aar) | Demo Project (.zip) |
---|---|---|---|---|
05/09/2019 | v1.1.2 | v1.1.2 | v1.0.0 | Download |
28/05/2019 | v1.1.1 | v1.1.1 | - | Download |
26/03/2019 | v1.0.0 | v1.0.0 | - | Download |
Download UVC Library file here, X5S Library file here and USB Serial Library file here.
Import downloaded modules into your project.
Repeat the Step (2) with X5S Library file.
Repeat the Step (2) with USB Serial Library file.
Add repository in build.gradle (the root level).
allprojects {
repositories {
...
maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }
//add this line
...
}
}
Set Target SDK to 27 in build.gradle (the root level).
android {
...
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 27 //set this to 27 or below 27.
...
}
}
Add the depdencies in app/build.gradle
implementation("com.serenegiant:common:1.5.20")
implementation("com.squareup.okio:okio:2.1.0")
//add these line before UVC Library and X5S Library
implementation project(':libuvccamera')
implementation project(':usbserial')
implementation project(':X5S-devkit-release')
Synchronize the Gradle.
Configure the activity orientation to Landscape.
Grant following permissions in your applications.
android.permission.CAMERA
android.permission.RECORD_AUDIO
android.permission.WRITE_EXTERNAL_STORAGE
Insert a CameraView into your layout file.
<com.madgaze.smartglass.view.SplitCameraView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/splitCameraView"
android:layout_centerInParent="true"/>
Set Camera Frame Format to MJPEG.
SplitCamera.getInstance(this).setFrameFormat(CameraHelper.FRAME_FORMAT_MJPEG);
Bind the created SplitCameraView to SplitCamera for video preview.
SplitCamera.getInstance(this).start(findViewById(R.id.splitCameraView));
Monitor the connectivity and start preview when X5S is connected.
SplitCamera.getInstance(this).setCameraCallback(new SplitCameraCallback() {
@Override
public void onConnected() {
//USB Camera (X5S) is connected.
SplitCamera.getInstance(MainActivity.this).startPreview();
//Start the preview immediately when it is connected.
}
@Override
public void onDisconnected() {
//USB Camera (X5S) is disconnected.
}
@Override
public void onError(int code) {
//Code 1: There is no connecting MAD Gaze Cameras.
}
});
Bind onResume(), onDestroy(), onStart(), onStop(), onPause() to your activity.
@Override
protected void onDestroy() {
super.onDestroy();
SplitCamera.getInstance(this).onDestroy();
}
@Override
protected void onStart() {
super.onStart();
SplitCamera.getInstance(this).onStart();
}
@Override
protected void onStop() {
super.onStop();
SplitCamera.getInstance(this).onStop();
}
@Override
protected void onResume() {
super.onResume();
SplitCamera.getInstance(this).onResume();
}
@Override
protected void onPause() {
super.onPause();
SplitCamera.getInstance(this).onPause();
}
Congratulation! You are now ready to see the Camera Preview from X5S with your application.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SplitCamera.getInstance(this).setFrameFormat(CameraHelper.FRAME_FORMAT_MJPEG);
SplitCamera.getInstance(this).start(findViewById(R.id.splitCameraView));
SplitCamera.getInstance(this).setCameraCallback(new SplitCameraCallback() {
@Override
public void onConnected() {
//USB Camera (X5S) is connected.
SplitCamera.getInstance(MainActivity.this).startPreview();
}
@Override
public void onDisconnected() {
//USB Camera (X5S) is disconnected.
}
@Override
public void onError(int code) {
//Code 1: There is no connecting MAD Gaze Cameras.
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
SplitCamera.getInstance(this).onDestroy();
}
@Override
protected void onStart() {
super.onStart();
SplitCamera.getInstance(this).onStart();
}
@Override
protected void onStop() {
super.onStop();
SplitCamera.getInstance(this).onStop();
}
@Override
protected void onResume() {
super.onResume();
SplitCamera.getInstance(this).onResume();
}
@Override
protected void onPause() {
super.onPause();
SplitCamera.getInstance(this).onPause();
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.madgaze.smartglass.view.SplitCameraView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/splitCameraView"
android:layout_centerInParent="true"/>
</RelativeLayout>
SplitCamera.getInstance(this).takePicture(new TakePictureCallback() {
@Override
public void onImageSaved(String path) {
//When image is saved succesfully
}
@Override
public void onError(int code) {
//When captured image is not saved successfully.
}
});
**You must set audio frequency to record the video. (See Audio Configuration)
SplitCamera.getInstance(this).startRecording();
SplitCamera.getInstance(this).stopRecording();
SplitCamera.getInstance(this).setRecordVideoCallback(new RecordVideoCallback() {
@Override
public void onVideoSaved(String path) {
//When video is saved succesfully
//path: the file location has been saved.
}
@Override
public void onError(int code) {
//When captured video is not saved successfully.
}
});
SplitCamera.getInstance(this).setOnPreviewFrameListener(new AbstractUVCCameraHandler.OnPreViewResultListener() {
@Override
public void onPreviewResult(byte[] yuv420sp) {
//Retrieve video data in YUV420sp format
}
});
SplitCamera.getInstance(this).setPreviewSize(SplitCamera.CameraDimension.DIMENSION_1280_720);
Width | Height | Configuration |
---|---|---|
1600 | 1200 | SplitCamera.CameraDimension.DIMENSION_1600_1200 |
2592 | 1944 | SplitCamera.CameraDimension.DIMENSION_2592_1944 |
2048 | 1536 | SplitCamera.CameraDimension.DIMENSION_2048_1536 |
1920 | 1080 | SplitCamera.CameraDimension.DIMENSION_1920_1080 |
1280 | 720 | SplitCamera.CameraDimension.DIMENSION_1280_720 |
640 | 480 | SplitCamera.CameraDimension.DIMENSION_640_480 |
1024 | 576 | SplitCamera.CameraDimension.DIMENSION_1024_576 |
SplitCamera.getInstance(this).setFrameFormat(CameraHelper.FRAME_FORMAT_MJPEG);
Format | Configuration |
---|---|
YUYV | CameraHelper.FRAME_FORMAT_YUYV |
MJPEG | CameraHelper.FRAME_FORMAT_MJPEG |
SplitCamera.getInstance(this).setAudioCallback(new AudioCallback() {
@Override
public void onAudioReceived(byte[] decodedAudio) {
//Retrieve audio data
}
});
SplitCamera.getInstance(this).setAudioSamFreq(SplitCamera.SamFreq.SamFreq_48000);
Frequency | Configuration |
---|---|
Mute | SplitCamera.SamFreq.SamFreq_None |
8000 | SplitCamera.SamFreq.SamFreq_8000 |
11025 | SplitCamera.SamFreq.SamFreq_11025 |
16000 | SplitCamera.SamFreq.SamFreq_16000 |
22050 | SplitCamera.SamFreq.SamFreq_22050 |
24000 | SplitCamera.SamFreq.SamFreq_24000 |
44100 | SplitCamera.SamFreq.SamFreq_44100 |
48000 | SplitCamera.SamFreq.SamFreq_48000 |
Q: Why error "Failed to find byte code for com/felhr/usbserial/UsbSerialInterface$UsbDSRCallback" is showed when compiling the codes?
Please ensure the gradle version is configured to greater or equal to 3.2. There is a bug that not able to compile the bytecodes for Gradle version 3.1 or below.
Q: Why the USB device is not detecting after completing all steps stated above?
Excluding the possible causes of hardware issue, you will need to provide permission of Camera and Microphone on Android 9.0 devices.
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
To request permissions approval from the users, please find article below: Request App Permissions: https://developer.android.com/training/permissions/requesting
Q: Why the videos are not successfully recorded?
You may need to include permission of Writing External Storage into your application in order to save the videos to the storage.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Q: Why the library "com.serenegiant:common:1.5.20" cannot be resolved?
You can download the library files below and reimport the library with Step 2 in Getting Started. http://file.madgaze.cn/sdk/files/libraries/others/com.serenegiant.common.1.5.20.aar
This library is licensed under the MAD Gaze - Terms of Use.