【基础】函数回调之 Callback 机制_实现(2)

举报
产品人卫朋 发表于 2021/10/29 23:22:22 2021/10/29
【摘要】   1) application层定义callback函数:     定义接口:     vim vendor/semc/frameworks/base/libs/camera-extension/api/src/com/sonyericsson/cameraexte...

  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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。