本文主要是介绍Android camera: openCamera[1],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
APP通过函数cameraAPI2 openCamera打开camera
public void openCamera(@NonNull String cameraId,
@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
APP传入的callback:CameraDevice.StateCallback的形式是:
public static abstract class StateCallback {public static final int ERROR_CAMERA_IN_USE = 1;
public static final int ERROR_MAX_CAMERAS_IN_USE = 2;
public static final int ERROR_CAMERA_DISABLED = 3;
public static final int ERROR_CAMERA_DEVICE = 4;
public static final int ERROR_CAMERA_SERVICE = 5;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"ERROR_"}, value =
{ERROR_CAMERA_IN_USE,
ERROR_MAX_CAMERAS_IN_USE,
ERROR_CAMERA_DISABLED,
ERROR_CAMERA_DEVICE,
ERROR_CAMERA_SERVICE })
public @interface ErrorCode {};
public abstract void onOpened(@NonNull CameraDevice camera); // Must implement
public void onClosed(@NonNull CameraDevice camera) {
// Default empty implementation
}
public abstract void onDisconnected(@NonNull CameraDevice camera); // Must implement
public abstract void onError(@NonNull CameraDevice camera,
@ErrorCode int error); // Must implement
}
/*传入StateCallback*/
public CameraDeviceImpl(String cameraId, StateCallback callback, Handler handler,
CameraCharacteristics characteristics, int appTargetSdkVersion) {
mCameraId = cameraId;
mDeviceCallback = callback;
mDeviceHandler = handler;
}
/*调用StateCallback*/
public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException {
synchronized(mInterfaceLock) {
mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice);
mDeviceHandler.post(mCallOnOpened);
}
}
private final Runnable mCallOnOpened = new Runnable() {
@Override
public void run() {
mDeviceCallback.onOpened(CameraDeviceImpl.this);
}
};
这里有两个callback:一个是APP实现的CameraDevice.StateCallback,另一个是
public class CameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub {
public void onDeviceError(final int errorCode, CaptureResultExtras resultExtras) {};
public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {};
public void onDeviceIdle() {};
public void onCaptureStarted(final CaptureResultExtras resultExtras, final long timestamp){};
public void onResultReceived(CameraMetadataNative result, CaptureResultExtras resultExtras){};
public void onPrepared(int streamId){};
public void onRequestQueueEmpty() {};
private void onCaptureErrorLocked(int errorCode, CaptureResultExtras resultExtras) {/*called by onDeviceError*/};
}
camera sevice想camera hal层传递的ICameraDeviceCallback 和上面的名字很像但没有"s",其中的实现会调用java层的callbacks
其中connectDevice的server端实现是:
CameraDeviceClient的构造函数,类的继承关系
class CameraDeviceClient :
public Camera2ClientBase<CameraDeviceClientBase>,
public camera2::FrameProcessorBase::FilteredListener
class Camera2ClientBase :
public CameraDeviceClientBase,
public CameraDeviceBase::NotificationListener
struct CameraDeviceClientBase :
public CameraService::BasicClient,
public hardware::camera2::BnCameraDeviceUser
CameraDeviceClient的构造函数会调用各个基类的构造函数
CameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,
const String16& clientPackageName,
const String8& cameraId,
int cameraFacing,
int clientPid,
uid_t clientUid,
int servicePid) :
Camera2ClientBase(cameraService, remoteCallback, clientPackageName,
cameraId, cameraFacing, clientPid, clientUid, servicePid),
mInputStream(),
mStreamingRequestId(REQUEST_ID_NONE),
mRequestIdCounter(0),
mPrivilegedClient(false) {
}
Camera2ClientBase<CameraDeviceClientBase>::Camera2ClientBase(
const sp<CameraService>& cameraService,
const sp<TCamCallbacks>& remoteCallback,
const String16& clientPackageName,
const String8& cameraId,
int cameraFacing,
int clientPid,
uid_t clientUid,
int servicePid):
CameraDeviceClientBase(cameraService, remoteCallback, clientPackageName,
cameraId, cameraFacing, clientPid, clientUid, servicePid),
mSharedCameraCallbacks(remoteCallback),
mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)),
mDeviceActive(false)
{
mInitialClientPid = clientPid;
mDevice = new Camera3Device(cameraId);
}
CameraDeviceClientBase::CameraDeviceClientBase(
const sp<CameraService>& cameraService,
const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,
const String16& clientPackageName,
const String8& cameraId,
int cameraFacing,
int clientPid,
uid_t clientUid,
int servicePid) :
BasicClient(cameraService,
IInterface::asBinder(remoteCallback),
clientPackageName,
cameraId,
cameraFacing,
clientPid,
clientUid,
servicePid),
mRemoteCallback(remoteCallback) {
}
CameraService::BasicClient::BasicClient(const sp<CameraService>& cameraService,
const sp<IBinder>& remoteCallback,
const String16& clientPackageName,
const String8& cameraIdStr, int cameraFacing,
int clientPid, uid_t clientUid,
int servicePid):
mCameraIdStr(cameraIdStr), mCameraFacing(cameraFacing),
mClientPackageName(clientPackageName), mClientPid(clientPid), mClientUid(clientUid),
mServicePid(servicePid),
mDisconnected(false),
mRemoteBinder(remoteCallback)
{
if (sCameraService == nullptr) {
sCameraService = cameraService;
}
}
public CameraDeviceBase,
virtual public hardware::camera::device::V3_2::ICameraDeviceCallback,
mId(id),
mOperatingMode(NO_MODE),
mIsConstrainedHighSpeedConfiguration(false),
mStatus(STATUS_UNINITIALIZED),
mStatusWaiters(0),
mUsePartialResult(false),
mNumPartialResults(1),
mTimestampOffset(0),
mNextResultFrameNumber(0),
mNextReprocessResultFrameNumber(0),
mNextShutterFrameNumber(0),
mNextReprocessShutterFrameNumber(0),
mListener(NULL),
mVendorTagId(CAMERA_METADATA_INVALID_VENDOR_ID)
{
camera3_callback_ops::notify = &sNotify;
camera3_callback_ops::process_capture_result = &sProcessCaptureResult;
}
创建CameraDeviceClient的过程也创建了CameraDevice
这篇关于Android camera: openCamera[1]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!