【基础】函数回调之 Callback 机制_实现(2)
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)。
文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/liwei16611/article/details/51315794
- 点赞
- 收藏
- 关注作者
评论(0)