Android-usbCamera移植步驟


1,導入libusbcamera  (庫模塊),統一sdk版本號。
在工程project的gradle添加該倉庫地址:
maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }
和構建腳本
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
 
 
2,作者把usb 監聽封裝到了自己的單例類 UVCCameraHelper
 
private UVCCameraHelper mCameraHelper;
private CameraViewInterface mUVCCameraView;
 
首先初始化這個類,和初始化攝像頭渲染器UVCCameraView
// step.1 initialize UVCCameraHelper
mUVCCameraView = (CameraViewInterface) mTextureView;
mUVCCameraView.setCallback(this); 
mCameraHelper = UVCCameraHelper.getInstance();
mCameraHelper.setDefaultFrameFormat(UVCCameraHelper.FRAME_FORMAT_MJPEG);
mCameraHelper.initUSBMonitor(this, mUVCCameraView, listener);
//設置預覽幀回調
mCameraHelper.setOnPreviewFrameListener(new AbstractUVCCameraHandler.OnPreViewResultListener() {
    @Override
    public void onPreviewResult(byte[] nv21Yuv) {
        Log.d(TAG, "onPreviewResult: "+nv21Yuv.length);
    }
});
 
//Oncreate外
private UVCCameraHelper.OnMyDevConnectListener listener = new UVCCameraHelper.OnMyDevConnectListener() {} ;
 
分析:
1,mUVCCameraView = (CameraViewInterface) mTextureView;
mUVCCameraView.setCallback(this); 
在布局添加usbcamera的看圖渲染器 <com.serenegiant.usb.widget.UVCCameraTextureView ,綁定控件,並設置回調this。 需要父類實現這個回調接口和接口方法。   CameraViewInterface.Callback
  CameraViewInterface.Callback的3個接口方法:
@Override   //  xml的渲染器創建時候,如果渲染器第一次創建,沒激活預覽標志且 usb攝像頭已經准備好,那就開始預覽
public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
    if (!isPreview && mCameraHelper.isCameraOpened()) {
        mCameraHelper.startPreview(mUVCCameraView);
        isPreview = true;
    }
}
public void onSurfaceChanged // 這個一般不寫
@Override // 銷毀渲染器時候,如果正在預覽 和usb設備在打開  ,停止預覽
public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
    if (isPreview && mCameraHelper.isCameraOpened()) {
        mCameraHelper.stopPreview();
        isPreview = false;
    }
}
 
 
2,初始化mCameraHelper  這個類,設置輸入格式和 插進usb設備監聽,把渲染器和usb設備連接監聽傳給它。
這樣就可以檢測到設備usb插入了。
在oncreate外 新建usb設備連接監聽。在里面實現usb設備插入,拔出,連接各個狀態的方法。
private UVCCameraHelper.OnMyDevConnectListener listener = new UVCCameraHelper.OnMyDevConnectListener() {} ;
 
 
3,在 onstart 和 onstop注冊卸載 usb監聽類registerUSB();,在ondestroy  釋放這個mCameraHelper類。
@Override
protected void onStart() {
    super.onStart();
    // step.2 register USB event broadcast
    if (mCameraHelper != null) {
        mCameraHelper.registerUSB();
    }
}
 
@Override
protected void onStop() {
    super.onStop();
    // step.3 unregister USB event broadcast
    if (mCameraHelper != null) {
        mCameraHelper.unregisterUSB();
    }
}
// step.4 release uvc camera resources
@Override
protected void onDestroy() {
    super.onDestroy();
if (mCameraHelper != null) {
    mCameraHelper.release();
}
 
 
 
問題一: 移植步驟出現空指針:
Attempt to invoke interface on a null object reference
可能是我用自帶的綁定了這個控件,
@BindView(R.id.camera_view)
public View mTextureView;
后面改用 mTextureView = findViewById(R.id.camera_view);
 
 
問題二:
插進usb沒反應,原來是獲取usb設備列表時候,把信息要存放到手機卡指定目錄。
由於手機沒這個文件夾,獲取不了設備信息。(paxel也沒有創建文件夾的能力)
public List<UsbDevice> getDeviceList(final List<DeviceFilter> filters)
 
如果不存在這個文件夾,那就創建。 但是用這個方法不能創建。所以就沒這個文件夾。
也有可能手機沒給讀寫權限。
 
解決方法:
后面新建文件夾,再新建文件。
String fileName = "/failed_devices.txt";
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/USBCamera/");/
//根目錄新建一個文件夾
   if (!file.exists())
      file.mkdirs();       //m目錄不存在,則新建目錄。
 
File logFile =new File(file, fileName);
if(! logFile.exists()) {
 
問題三:偶爾出現
setDefaultFrameFormat should be call before initMonitor
 
 
問題四;
有時候退出進來閃退
java.lang.IllegalStateException: The specified message queue synchronization  barrier token has not been posted or has already been removed.
消息隊列問題。
 
 
使用gosky 原來已經有ijkview了,自己再添加一個顯示view 后的層疊順序問題。
解決,用幀布局,最后個添加的總是在最上面。或者用這個函數 XXview.bringToFront()把它提到上面。
 
有些攝像頭用不了,原來是分辨率不對。不設置的話初始分辨率是800X600,可以在
mCameraHelper.setDefaultFrameFormat(UVCCameraHelper.FRAME_FORMAT_MJPEG);
后面設置預覽分辨率。
mCameraHelper.setDefaultPreviewSize(1280,720);
這個分辨率,小米6完美全屏,但是PEXAL由於有虛擬按鍵,不能全屏。
 
然后金立5.1 不能用 ,原來我用all64debug 來調式。 這個應該是32位的。
待解決!!!
 
mCameraHelper封裝一些接口給開發者用,如設置分辨率,拍照錄像。獲取設備列表。等等。
ControlPanelActivity.java
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM