以下代码段显示了如何在Activity
中初始化OpenCV4Android,例如在this sample app,但我需要在Fragment
内进行(因为我的JavaCameraView
在我的片段中)。
我会像在Activity
中那样做,即我会直接在类体内(在任何方法体外)初始化baseLoaderCallback
,但这样,初始化代码(以下代码段中的第4个语句)将在Fragment
实例化后立即执行。
正如我们所看到的,BaseLoaderCallback
构造函数将应用程序上下文作为参数,在调用getActivity()
之前我无法调用onActivityCreated()
,因为在onActivityCreated()
之前{1}},getActivity()
可以返回null。
public class AnActivity extends Activity implements CvCameraViewListener2 {
...
private JavaCameraView javaCameraView;
...
private CameraBridgeViewBase cameraBridgeViewBase;
BaseLoaderCallback baseLoaderCallback = new BaseLoaderCallback(getActivity().getApplicationContext()) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
cameraBridgeViewBase.enableView();
break;
default:
super.onManagerConnected(status);
break;
}
}
};
...
//SOME LIFE CYCLE CALL BACK METHODS
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, getActivity().getApplicationContext(),
baseLoaderCallback);
}
...
}
答案 0 :(得分:1)
即使你在类体中初始化onManagerConnected
(在构造函数体之前执行),在OpenCVLoader.initAsync
完成之前不会调用回调函数onResume
,所以直到getActivity()
。
如果您想避免在onAttach
之前调用null
(因为它会返回baseLoaderCallback
),那么只需将onResume
的初始化程序放在/dev/sdb1 /media/mystuff ext3 defaults 1 2
中直到那时你才真正需要它。