您的位置:首页 > 其它

Callback机制_实现(2)

2016-05-04 16:09 204 查看
1) application层定义callback函数:

定义接口:

vim vendor/semc/frameworks/base/libs/camera-extension/api/src/com/sonyericsson/cameraextension/CameraExtension.java

public interface ObjectTrackingCallback {

void onObjectTracked(ObjectTrackingResult objectTrackingResult);

}

定义callback函数,是真实处理底层数据的函数:

vim vendor/semc/packages/apps/camera-addons/CameraUI/src/com/sonyericsson/android/camera/controller/ObjectTracking.java

private class ObjectTrackingCallback implements CameraExtension.ObjectTrackingCallback {

@Override

public void onObjectTracked(ObjectTrackingResult result) {

……

if (mShouldWaitForLost) {

if (!result.mIsLost) {

// Ignore detect object event for wait next lost event.

if (CameraLogger.DEBUG) CameraLogger.d(TAG, "onObjectTracked: ignore detect.");

return;

} else {

// Restart object tracking after lost event.

if (CameraLogger.DEBUG) CameraLogger.d(TAG, "onObjectTracked: restart.");

mController.mCameraDevice.stopObjectTrackingCallback();

startTracking(mPosition);

mShouldWaitForLost = false;

}

}

// Ignore continuous lost event.

if (mIsAlreadyLost && result.mIsLost) {

if (CameraLogger.DEBUG) CameraLogger.d(TAG, "onObjectTracked: ignore lost");

return;

}

mIsAlreadyLost = result.mIsLost;

if (result.mIsLost) {

mHandler.startTimeoutCount();

} else {

mHandler.stopTimeoutCount();

Executor.postEvent(ControllerEvent.EV_OBJECT_TRACKING, 0,

result.mRectOfTrackedObject);

}

}

}

调用java接口函数注册callback函数:

private void startTracking(Rect position) {

if (CameraLogger.DEBUG) CameraLogger.d(TAG, "startTracking: " + position);

mCallback = new ObjectTrackingCallback(); //callback函数

mController.mCameraWindow.startObjectTrackingAnimation(position);

mController.mCameraDevice.startObjectTracking(

PositionConverter.getInstance().convertFaceToDevice(position),

mCallback); //传递callback函数

}

vim vendor/semc/packages/apps/camera-addons/CameraUI/src/com/sonyericsson/android/camera/device/CameraDevice.java

public void startObjectTracking(Rect position, ObjectTrackingCallback cb) {

…… //接口函数-frameworks层提供

mCameraExtension.setObjectTrackingCallback(cb //cb即为上面传递下来的callback函数,

CameraDeviceUtil.OBJECT_TRACKING_LOW_PASS_FILTER_STRENGTH,

CameraDeviceUtil.OBJECT_TRACKING_MINIMAL_INTERVAL_MS);

mCameraExtension.startObjectTracking();

mCameraExtension.selectObject(position.centerX(), position.centerY());

mIsObjectTrackingRunning = true;

……

new EachCameraStatusPublisher(mCameraActivity, mCameraId)

.put(new ObjectTracking(ObjectTracking.Value.ON))

.publish();

}

实现用于注册callback函数的java接口函数:

vim vendor/semc/frameworks/base/libs/camera-extension/api/src/com/sonyericsson/cameraextension/CameraExtension.java

public final void setObjectTrackingCallback(

final ObjectTrackingCallback cb,

int lowPassFilterStrength,

int minimumIntervalMilliSec) {

if (mIsReleased) {

return;

}

mObjectTrackingCallback = cb; //获得application层传下的callback函数指针

if (Integer.MAX_VALUE < minimumIntervalMilliSec) {

minimumIntervalMilliSec = minimumIntervalMilliSec;

}

/* ++ Somc-integrate-CameraExtension-01 */

//setObjectTrackingLowPassFilterPrameters(lowPassFilterStrength, minimumIntervalMilliSec);

if (mCamera != null) {

if (mObjectTrackingFWCallback == null) {

mObjectTrackingFWCallback = new OTCallback(); //又一callback函数

} //调用另一注册函数注册另一个callback函数2(双callback)

mCamera.setObjectTrackingLowPassFilterPrameters(mObjectTrackingFWCallback,

lowPassFilterStrength, minimumIntervalMilliSec);

}

/* -- Somc-integrate-CameraExtension-01 */

}

2) 接口层定义callback函数:

定义接口:

vim frameworks/base/core/java/android/hardware/Camera.java

public interface ObjectTrackingFWCallback {

void onObjectTrackingFWCallback(ObjectTrackingResult objectTrackingResult, Camera camera);

};

定义callback函数,是真实处理底层数据的函数:

vim vendor/semc/frameworks/base/libs/camera-extension/api/src/com/sonyericsson/cameraextension/CameraExtension.java

class OTCallback implements Camera.ObjectTrackingFWCallback {

public void onObjectTrackingFWCallback(Camera.ObjectTrackingResult objectTrackingResult,

Camera camera) {

if (mObjectTrackingCallback != null && objectTrackingResult != null) {

……

if (mObjectTrackingResult == null)

mObjectTrackingResult = new ObjectTrackingResult();

mObjectTrackingResult.mRectOfTrackedObject = new android.graphics.Rect(

objectTrackingResult.mRectOfTrackedObject.left, objectTrackingResult.mRectOfTrackedObject.top,

objectTrackingResult.mRectOfTrackedObject.right, objectTrackingResult.mRectOfTrackedObject.bottom);

mObjectTrackingResult.mIsLost = objectTrackingResult.mIsLost;

mObjectTrackingCallback.onObjectTracked(mObjectTrackingResult);

} //由上述处理可知,callback2将得到的数据传递给callback1—>传至application

}

}

实现用于注册callback的接口函数:

vim frameworks/base/core/java/android/hardware/Camera.java

public void setObjectTrackingLowPassFilterPrameters(ObjectTrackingFWCallback cb, int lowPassFilterStrength, int minimumIntervalMilliSec){

mObjectTrackingFWCallback = cb;

_setObjectTrackingLowPassFilterPrameters(lowPassFilterStrength, minimumIntervalMilliSec);

}

接下来通过handler机制将client端得到的数据传给当前callback函数(mObjectTrackingFWCallback)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: