【基础】函数回调之 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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

产品人卫朋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值