日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android sse 人脸识别,基于Android Camera2之openCamera 流程

發(fā)布時(shí)間:2024/7/23 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android sse 人脸识别,基于Android Camera2之openCamera 流程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡介

frameworks\base\core\java\android\hardware\camera2

Camera2在Android 5.0上首次出現(xiàn),主要重新定義了一套Camera 的使用接口API,設(shè)計(jì)思想出現(xiàn)了變化,具體的可自行搜索,此處主要介紹下Camera2的常見類以及使用流程。

CameraCaptureSession 類 會(huì)話類,即用戶發(fā)起操作Camera設(shè)備的動(dòng)作類,如錄像拍照等

CaptureRequest類 請求類,用戶對Camera發(fā)起請求的抽象封裝類

CameraDevice類 Camera抽象類,類似于Camaera的一個(gè)客戶端

CameraCharacteristics類 相機(jī)參數(shù)類,比如相機(jī)支持哪些特性,如分辨率集合等

除此之外這些類中還會(huì)存在內(nèi)部類,內(nèi)部類的作用是Camera Framework 層完成配置異步返回結(jié)果的抽象類

以上幾個(gè)主要的類都在base/core下面,在對外發(fā)布API的時(shí)候App均可使用

frameworks\base\media

ImageReader類 相機(jī)采集回來的數(shù)據(jù)承載類,即相機(jī)的YUV元數(shù)據(jù)承載類

在APP層使用相機(jī)拍照 錄制視頻 等過程中上述主要類均離不開,本系列主要圍繞關(guān)鍵類,介紹其關(guān)鍵流程,本文主要介紹openCamera流程

1: openCamera 基本流程

Framework層流程也是針對上訴幾個(gè)關(guān)鍵步驟進(jìn)行分析的,我們逐個(gè)往下分析

首先看下App層在openCamera的時(shí)候Framework層發(fā)生了什么,做了什么

frameworks\base\core\java\android\hardware\camera2\CameraManager.java

@RequiresPermission(android.Manifest.permission.CAMERA)

public void openCamera(@NonNull String cameraId,

@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)

throws CameraAccessException {

openCameraForUid(cameraId, callback, handler, USE_CALLING_UID);

}

檢查參數(shù)

public void openCameraForUid(@NonNull String cameraId,

@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler,

int clientUid)

throws CameraAccessException {

if(TdDeviceManager.disallowOp(TdDeviceManager.DISABLED_CAMERA)) {

throw new IllegalArgumentException("camera is disabled by MDM");

}

if (cameraId == null) {

throw new IllegalArgumentException("cameraId was null");

} else if (callback == null) {

throw new IllegalArgumentException("callback was null");

} else if (handler == null) {

if (Looper.myLooper() != null) {

handler = new Handler();

} else {

throw new IllegalArgumentException(

"Handler argument is null, but no looper exists in the calling thread");

}

}

openCameraDeviceUserAsync(cameraId, callback, handler, clientUid);

}

關(guān)鍵方法

/**

* Helper for opening a connection to a camera with the given ID.

*

* @param cameraId The unique identifier of the camera device to open

* @param callback The callback for the camera. Must not be null.

* @param handler The handler to invoke the callback on. Must not be null.

* @param uid The UID of the application actually opening the camera.

* Must be USE_CALLING_UID unless the caller is a service

* that is trusted to open the device on behalf of an

* application and to forward the real UID.

*

* @throws CameraAccessException if the camera is disabled by device policy,

* too many camera devices are already open, or the cameraId does not match

* any currently available camera device.

*

* @throws SecurityException if the application does not have permission to

* access the camera

* @throws IllegalArgumentException if callback or handler is null.

* @return A handle to the newly-created camera device.

*

* @see #getCameraIdList

* @see android.app.admin.DevicePolicyManager#setCameraDisabled

*/

private CameraDevice openCameraDeviceUserAsync(String cameraId,

CameraDevice.StateCallback callback, Handler handler, final int uid)

throws CameraAccessException {

CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);

CameraDevice device = null;

synchronized (mLock) {

ICameraDeviceUser cameraUser = null;

android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =

new android.hardware.camera2.impl.CameraDeviceImpl(

cameraId,

callback,

handler,

characteristics,

mContext.getApplicationInfo().targetSdkVersion);

ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();

try {

if (supportsCamera2ApiLocked(cameraId)) {

// Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices

//[HSM]

if(!HwSystemManager.allowOp(HwSystemManager.PERMISSION_CAMERA)) {

ServiceSpecificException e = new ServiceSpecificException(ICameraService.ERROR_DISABLED);

throwAsPublicException(e);

}

Log.i(TAG, "open camera: " + cameraId + ", package name: " + mContext.getOpPackageName());

HwSystemManager.notifyBackgroundMgr(mContext.getOpPackageName(),

Binder.getCallingPid(),

Binder.getCallingUid(),

HwSystemManager.CAMARA_SERVICE_NOTIFY,

HwSystemManager.BACKGROUND_POLICY_OPEN);

ICameraService cameraService = CameraManagerGlobal.get().getCameraService();

if (cameraService == null) {

throw new ServiceSpecificException(

ICameraService.ERROR_DISCONNECTED,

"Camera service is currently unavailable");

}

cameraUser = cameraService.connectDevice(callbacks, cameraId,

mContext.getOpPackageName(), uid);

} else {

// Use legacy camera implementation for HAL1 devices

int id;

try {

id = Integer.parseInt(cameraId);

} catch (NumberFormatException e) {

throw new IllegalArgumentException("Expected cameraId to be numeric, but it was: "

+ cameraId);

}

Log.i(TAG, "Using legacy camera HAL.");

cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks, id);

}

} catch (ServiceSpecificException e) {

if (e.errorCode == ICameraService.ERROR_DEPRECATED_HAL) {

throw new AssertionError("Should've gone down the shim path");

} else if (e.errorCode == ICameraService.ERROR_CAMERA_IN_USE ||

e.errorCode == ICameraService.ERROR_MAX_CAMERAS_IN_USE ||

e.errorCode == ICameraService.ERROR_DISABLED ||

e.errorCode == ICameraService.ERROR_DISCONNECTED ||

e.errorCode == ICameraService.ERROR_INVALID_OPERATION) {

// Received one of the known connection errors

// The remote camera device cannot be connected to, so

// set the local camera to the startup error state

deviceImpl.setRemoteFailure(e);

if (e.errorCode == ICameraService.ERROR_DISABLED ||

e.errorCode == ICameraService.ERROR_DISCONNECTED ||

e.errorCode == ICameraService.ERROR_CAMERA_IN_USE) {

// Per API docs, these failures call onError and throw

throwAsPublicException(e);

}

} else {

// Unexpected failure - rethrow

throwAsPublicException(e);

}

} catch (RemoteException e) {

// Camera service died - act as if it's a CAMERA_DISCONNECTED case

ServiceSpecificException sse = new ServiceSpecificException(

ICameraService.ERROR_DISCONNECTED,

"Camera service is currently unavailable");

deviceImpl.setRemoteFailure(sse);

throwAsPublicException(sse);

}

// TODO: factor out callback to be non-nested, then move setter to constructor

// For now, calling setRemoteDevice will fire initial

// onOpened/onUnconfigured callbacks.

// This function call may post onDisconnected and throw CAMERA_DISCONNECTED if

// cameraUser dies during setup.

deviceImpl.setRemoteDevice(cameraUser);

device = deviceImpl;

}

return device;

}

關(guān)鍵部分代碼如上,主要干了什么了?

1:創(chuàng)建了Camera Client 即 deviceImpl,此對象也就是返回APP進(jìn)程中的對象

android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =new android.hardware.camera2.impl.CameraDeviceImpl(cameraId, callback,handler,characteristics,mContext.getApplicationInfo().targetSdkVersion);

2:將第一步創(chuàng)建的Client 和Framework 的Camera Service 聯(lián)系起來,并且注冊了一個(gè)回調(diào),在物理Camera實(shí)際有什么狀態(tài)時(shí),及時(shí)通知到App層

cameraUser = cameraService.connectDevice(callbacks, cameraId,

mContext.getOpPackageName(), uid);

3:將deviceImpl 和ICameraDeviceUser cameraUser聯(lián)系起來,即App用戶提過deviceImpl下發(fā)指令,deviceImpl 通過cameraUser 操作Framework層的 Camera,并且將Framework層的Camera的客戶端返回給高層

deviceImpl.setRemoteDevice(cameraUser);

2:openCamera關(guān)鍵步驟

關(guān)鍵步驟1:

在CameraManager openCamera的時(shí)候就創(chuàng)建了給APP 用的Client,此Client初始化的參數(shù)關(guān)注下即可,主要是傳了camera 的id(哪個(gè)攝像頭),攝像頭的回調(diào)接口callback,此接口在Camera創(chuàng)建完成就返回給APP進(jìn)程了,handler是App處理相機(jī)打卡回調(diào)的接收者,此處關(guān)鍵就是Framework 返回App的是CameraDeviceImpl 對象,但是實(shí)際接口返回的要求是一個(gè)CameraDevice對象,如下:

/**

* The method called when a camera device has finished opening.

*

*

At this point, the camera device is ready to use, and

* {@link CameraDevice#createCaptureSession} can be called to set up the first capture

* session.

*

* @param camera the camera device that has become opened

*/

public abstract void onOpened(@NonNull CameraDevice camera); // Must implement

關(guān)鍵步驟2:

此步驟是打開Camera的最關(guān)鍵的一步,首先是獲取Framework層的Camera Service,即

ICameraService cameraService

ICameraService cameraService = CameraManagerGlobal.get().getCameraService();

然后就通過 cameraService

cameraUser = cameraService.connectDevice(callbacks, cameraId,

mContext.getOpPackageName(), uid);

主要傳了 callback(Cameraservice 回調(diào)App的接口),Camera的id 進(jìn)程號(hào) 和包名(下面代碼刪除了部分,主要說明此回調(diào)作用)

public class CameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub {

@Override

public IBinder asBinder() {

return this;

}

@Override

public void onDeviceError(final int errorCode, CaptureResultExtras resultExtras) {

}

@Override

public void onRepeatingRequestError(long lastFrameNumber) {

}

@Override

public void onDeviceIdle() {

}

@Override

public void onCaptureStarted(final CaptureResultExtras resultExtras, final long timestamp) {

}

@Override

public void onResultReceived(CameraMetadataNative result,

}

@Override

public void onPrepared(int streamId) {

}

@Override

public void onRequestQueueEmpty() {

}

}

Callback對象,根據(jù)此對象定義可知是通過Binder傳遞過來的

通過Binder 調(diào)用Camera Service的connectDevice,Camera Service是Camera 進(jìn)程初始化注冊到ServicesManager中的,服務(wù)的承載代碼即CameraService.cpp,因此查看下:

Status CameraService::connectDevice(

const sp<:camera2::icameradevicecallbacks>& cameraCb,

const String16& cameraId,

const String16& clientPackageName,

int clientUid,

/*out*/

sp<:camera2::icameradeviceuser>* device) {

ATRACE_CALL();

Status ret = Status::ok();

String8 id = String8(cameraId);

sp client = nullptr;

ret = connectHelper<:camera2::icameradevicecallbacks>(cameraCb, id,

CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName,

clientUid, USE_CALLING_PID, API_2,

/*legacyMode*/ false, /*shimUpdateOnly*/ false,

/*out*/client);

if(!ret.isOk()) {

logRejected(id, getCallingPid(), String8(clientPackageName),

ret.toString8());

return ret;

}

String8 pid = String8::format("%d", getCallingPid());

POWERPUSH(129, clientName8.string(), id.string(), pid.string());//define in LogPower.java, 129 stand for camera start now

*device = client;

//add for send msg to nfc

char needSendMsg[255];

property_get("ro.config.hw_camera_nfc_switch",needSendMsg,"");

ALOGI("NFC polling %s", needSendMsg);

if (0 == strcmp(needSendMsg, "true")) {

String8 isOpen = String8::format("false");

android::allowNfcPolling(isOpen);

}

ALOGI("%s(), exit.", __FUNCTION__);

return ret;

}

關(guān)鍵函數(shù)connectHelper

template

Status CameraService::connectHelper(const sp& cameraCb, const String8& cameraId,

int halVersion, const String16& clientPackageName, int clientUid, int clientPid,

apiLevel effectiveApiLevel, bool legacyMode, bool shimUpdateOnly,

/*out*/sp& device) {

binder::Status ret = binder::Status::ok();

String8 clientName8(clientPackageName);

int originalClientPid = 0;

ALOGI("CameraService::connect call (PID %d \"%s\", camera ID %s) for HAL version %s and "

"Camera API version %d", clientPid, clientName8.string(), cameraId.string(),

(halVersion == -1) ? "default" : std::to_string(halVersion).c_str(),

static_cast(effectiveApiLevel));

sp client = nullptr;

{

// Acquire mServiceLock and prevent other clients from connecting

std::unique_ptr lock =

AutoConditionLock::waitAndAcquire(mServiceLockWrapper, DEFAULT_CONNECT_TIMEOUT_NS);

if (lock == nullptr) {

ALOGE("CameraService::connect (PID %d) rejected (too many other clients connecting)."

, clientPid);

return STATUS_ERROR_FMT(ERROR_MAX_CAMERAS_IN_USE,

"Cannot open camera %s for \"%s\" (PID %d): Too many other clients connecting",

cameraId.string(), clientName8.string(), clientPid);

}

// Enforce client permissions and do basic sanity checks

if(!(ret = validateConnectLocked(cameraId, clientName8,

/*inout*/clientUid, /*inout*/clientPid, /*out*/originalClientPid)).isOk()) {

return ret;

}

// Check the shim parameters after acquiring lock, if they have already been updated and

// we were doing a shim update, return immediately

if (shimUpdateOnly) {

auto cameraState = getCameraState(cameraId);

if (cameraState != nullptr) {

if (!cameraState->getShimParams().isEmpty()) return ret;

}

}

status_t err;

sp clientTmp = nullptr;

std::shared_ptr<:clientdescriptor sp>>> partial;

if ((err = handleEvictionsLocked(cameraId, originalClientPid, effectiveApiLevel,

IInterface::asBinder(cameraCb), clientName8, /*out*/&clientTmp,

/*out*/&partial)) != NO_ERROR) {

switch (err) {

case -ENODEV:

return STATUS_ERROR_FMT(ERROR_DISCONNECTED,

"No camera device with ID \"%s\" currently available",

cameraId.string());

case -EBUSY:

return STATUS_ERROR_FMT(ERROR_CAMERA_IN_USE,

"Higher-priority client using camera, ID \"%s\" currently unavailable",

cameraId.string());

default:

return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,

"Unexpected error %s (%d) opening camera \"%s\"",

strerror(-err), err, cameraId.string());

}

}

if (clientTmp.get() != nullptr) {

// Handle special case for API1 MediaRecorder where the existing client is returned

device = static_cast(clientTmp.get());

return ret;

}

// give flashlight a chance to close devices if necessary.

mFlashlight->prepareDeviceOpen(cameraId);

int facing = -1;

int deviceVersion = getDeviceVersion(cameraId, /*out*/&facing);

if (facing == -1) {

ALOGE("%s: Unable to get camera device \"%s\" facing", __FUNCTION__, cameraId.string());

return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,

"Unable to get camera device \"%s\" facing", cameraId.string());

}

sp tmp = nullptr;

if(!(ret = makeClient(this, cameraCb, clientPackageName, cameraId, facing, clientPid,

clientUid, getpid(), legacyMode, halVersion, deviceVersion, effectiveApiLevel,

/*out*/&tmp)).isOk()) {

return ret;

}

client = static_cast(tmp.get());

ALOGI("%s(), make client for '%s'.", __FUNCTION__, String8{clientPackageName}.string());

LOG_ALWAYS_FATAL_IF(client.get() == nullptr, "%s: CameraService in invalid state",

__FUNCTION__);

err = client->initialize(mCameraProviderManager);

if (err != OK) {

ALOGE("%s: Could not initialize client from HAL.", __FUNCTION__);

// Errors could be from the HAL module open call or from AppOpsManager

switch(err) {

case BAD_VALUE:

return STATUS_ERROR_FMT(ERROR_ILLEGAL_ARGUMENT,

"Illegal argument to HAL module for camera \"%s\"", cameraId.string());

case -EBUSY:

return STATUS_ERROR_FMT(ERROR_CAMERA_IN_USE,

"Camera \"%s\" is already open", cameraId.string());

case -EUSERS:

return STATUS_ERROR_FMT(ERROR_MAX_CAMERAS_IN_USE,

"Too many cameras already open, cannot open camera \"%s\"",

cameraId.string());

case PERMISSION_DENIED:

return STATUS_ERROR_FMT(ERROR_PERMISSION_DENIED,

"No permission to open camera \"%s\"", cameraId.string());

case -EACCES:

return STATUS_ERROR_FMT(ERROR_DISABLED,

"Camera \"%s\" disabled by policy", cameraId.string());

case -ENODEV:

default:

return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,

"Failed to initialize camera \"%s\": %s (%d)", cameraId.string(),

strerror(-err), err);

}

}

// Update shim paremeters for legacy clients

if (effectiveApiLevel == API_1) {

// Assume we have always received a Client subclass for API1

sp shimClient = reinterpret_cast(client.get());

String8 rawParams = shimClient->getParameters();

CameraParameters params(rawParams);

auto cameraState = getCameraState(cameraId);

if (cameraState != nullptr) {

cameraState->setShimParams(params);

} else {

ALOGE("%s: Cannot update shim parameters for camera %s, no such device exists.",

__FUNCTION__, cameraId.string());

}

}

if (shimUpdateOnly) {

// If only updating legacy shim parameters, immediately disconnect client

mServiceLock.unlock();

client->disconnect();

mServiceLock.lock();

} else {

// Otherwise, add client to active clients list

finishConnectLocked(client, partial);

}

} // lock is destroyed, allow further connect calls

device = client;

return ret;

}

關(guān)鍵函數(shù)makeClient

Status CameraService::makeClient(const sp& cameraService,

const sp& cameraCb, const String16& packageName, const String8& cameraId,

int facing, int clientPid, uid_t clientUid, int servicePid, bool legacyMode,

int halVersion, int deviceVersion, apiLevel effectiveApiLevel,

/*out*/sp* client) {

if (halVersion < 0 || halVersion == deviceVersion) {

// Default path: HAL version is unspecified by caller, create CameraClient

// based on device version reported by the HAL.

switch(deviceVersion) {

case CAMERA_DEVICE_API_VERSION_1_0:

if (effectiveApiLevel == API_1) { // Camera1 API route

sp tmp = static_cast(cameraCb.get());

*client = new CameraClient(cameraService, tmp, packageName, cameraIdToInt(cameraId),

facing, clientPid, clientUid, getpid(), legacyMode);

} else { // Camera2 API route

ALOGW("Camera using old HAL version: %d", deviceVersion);

return STATUS_ERROR_FMT(ERROR_DEPRECATED_HAL,

"Camera device \"%s\" HAL version %d does not support camera2 API",

cameraId.string(), deviceVersion);

}

break;

case CAMERA_DEVICE_API_VERSION_3_0:

case CAMERA_DEVICE_API_VERSION_3_1:

case CAMERA_DEVICE_API_VERSION_3_2:

case CAMERA_DEVICE_API_VERSION_3_3:

case CAMERA_DEVICE_API_VERSION_3_4:

if (effectiveApiLevel == API_1) { // Camera1 API route

sp tmp = static_cast(cameraCb.get());

*client = new Camera2Client(cameraService, tmp, packageName, cameraIdToInt(cameraId),

facing, clientPid, clientUid, servicePid, legacyMode);

} else { // Camera2 API route

sp<:camera2::icameradevicecallbacks> tmp =

static_cast<:camera2::icameradevicecallbacks>(cameraCb.get());

*client = new CameraDeviceClient(cameraService, tmp, packageName, cameraId,

facing, clientPid, clientUid, servicePid);

}

break;

default:

// Should not be reachable

ALOGE("Unknown camera device HAL version: %d", deviceVersion);

return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,

"Camera device \"%s\" has unknown HAL version %d",

cameraId.string(), deviceVersion);

}

} else {

// A particular HAL version is requested by caller. Create CameraClient

// based on the requested HAL version.

if (deviceVersion > CAMERA_DEVICE_API_VERSION_1_0 &&

halVersion == CAMERA_DEVICE_API_VERSION_1_0) {

// Only support higher HAL version device opened as HAL1.0 device.

sp tmp = static_cast(cameraCb.get());

*client = new CameraClient(cameraService, tmp, packageName, cameraIdToInt(cameraId),

facing, clientPid, clientUid, servicePid, legacyMode);

} else {

// Other combinations (e.g. HAL3.x open as HAL2.x) are not supported yet.

ALOGE("Invalid camera HAL version %x: HAL %x device can only be"

" opened as HAL %x device", halVersion, deviceVersion,

CAMERA_DEVICE_API_VERSION_1_0);

return STATUS_ERROR_FMT(ERROR_ILLEGAL_ARGUMENT,

"Camera device \"%s\" (HAL version %d) cannot be opened as HAL version %d",

cameraId.string(), deviceVersion, halVersion);

}

}

return Status::ok();

}

在此處有2 個(gè)關(guān)鍵步驟

步驟1:創(chuàng)建Camera 的客戶端 Client,根據(jù)調(diào)用出可知是 CameraDeviceClient,創(chuàng)建時(shí)同時(shí)傳入了一個(gè)Hal層回調(diào)的狀態(tài)對象,為ICameraDeviceCallbacks 分別對應(yīng)上面2個(gè)函數(shù)

makeClient 函數(shù) 會(huì)根據(jù)傳入的HAL版本號(hào)halVersion 和設(shè)備版本號(hào)deviceVersion 進(jìn)行初始化以及API的版本號(hào),初始化了一個(gè)CamDeviceClien對象

查看構(gòu)造函數(shù)發(fā)現(xiàn)初始化了父類Camera2ClientBase

CameraDeviceClient::CameraDeviceClient(const sp& cameraService,

const sp<: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) {

ATRACE_CALL();

ALOGI("CameraDeviceClient %s: Opened", cameraId.string());

}

繼續(xù)查看最終發(fā)現(xiàn)是初始化了一個(gè) Camera3Device對象,這個(gè)就是java APP

在打開 Cmaera 時(shí)真正創(chuàng)建的Frameowok 層對象,屬于真正干活的

template

Camera2ClientBase::Camera2ClientBase(

const sp& cameraService,

const sp& remoteCallback,

const String16& clientPackageName,

const String8& cameraId,

int cameraFacing,

int clientPid,

uid_t clientUid,

int servicePid):

TClientBase(cameraService, remoteCallback, clientPackageName,

cameraId, cameraFacing, clientPid, clientUid, servicePid),

mSharedCameraCallbacks(remoteCallback),

mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)),

mDeviceActive(false)

{

ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(),

String8(clientPackageName).string(), clientPid, clientUid);

mInitialClientPid = clientPid;

mDevice = new Camera3Device(cameraId);

LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here.");

}

步驟二:

對此CameraDeviceClient 進(jìn)行初始化,初始化的時(shí)候傳入了mCameraProviderManager,即

client = static_cast(tmp.get());

ALOGI("%s(), make client for '%s'.", __FUNCTION__, String8{clientPackageName}.string());

LOG_ALWAYS_FATAL_IF(client.get() == nullptr, "%s: CameraService in invalid state",

__FUNCTION__);

err = client->initialize(mCameraProviderManager);

sp mCameraProviderManager,此對象在CameraService 初始化的時(shí)候就構(gòu)造出來了,主要工作之一也是連接HAI層

mCameraProviderManager 是CameraServics 構(gòu)造函數(shù)初始化的時(shí)候賦值的

if (nullptr == mCameraProviderManager.get()) {

mCameraProviderManager = new CameraProviderManager();

res = mCameraProviderManager->initialize(this);

if (res != OK) {

ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",

__FUNCTION__, strerror(-res), res);

return res;

}

}

3:通知APP層Camera狀態(tài)

frameworks\base\core\java\android\hardware\camera2\impl\CameraDeviceImpl.java

通知到APP Camera 已經(jīng)打開,即在nataive 創(chuàng)建了CameraClient 完成之后CameraManager將native camera device設(shè)到j(luò)ava 的CameraDevice 之后即通知了APP,Camera創(chuàng)建好了

deviceImpl.setRemoteDevice(cameraUser);

device = deviceImpl;

/**

* Set remote device, which triggers initial onOpened/onUnconfigured callbacks

*

*

This function may post onDisconnected and throw CAMERA_DISCONNECTED if remoteDevice dies

* during setup.

*

*/

public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException {

synchronized(mInterfaceLock) {

// TODO: Move from decorator to direct binder-mediated exceptions

// If setRemoteFailure already called, do nothing

if (mInError) return;

mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice);

IBinder remoteDeviceBinder = remoteDevice.asBinder();

// For legacy camera device, remoteDevice is in the same process, and

// asBinder returns NULL.

if (remoteDeviceBinder != null) {

try {

remoteDeviceBinder.linkToDeath(this, /*flag*/ 0);

} catch (RemoteException e) {

CameraDeviceImpl.this.mDeviceHandler.post(mCallOnDisconnected);

throw new CameraAccessException(CameraAccessException.CAMERA_DISCONNECTED,

"The camera device has encountered a serious error");

}

}

mDeviceHandler.post(mCallOnOpened);

mDeviceHandler.post(mCallOnUnconfigured);

}

}

private final Runnable mCallOnOpened = new Runnable() {

@Override

public void run() {

StateCallbackKK sessionCallback = null;

synchronized(mInterfaceLock) {

if (mRemoteDevice == null) return; // Camera already closed

sessionCallback = mSessionStateCallback;

}

if (sessionCallback != null) {

sessionCallback.onOpened(CameraDeviceImpl.this);

}

mDeviceCallback.onOpened(CameraDeviceImpl.this);

}

};

此處是在App層定義了AIDL 接口,但是服務(wù)是native層的,為了雙方能通信,Aidl的調(diào)用客戶端是使用java 實(shí)現(xiàn),服務(wù)端采用c++實(shí)現(xiàn)的,確保了binder通信正常,此處用到的Binder服務(wù)關(guān)鍵函數(shù)為

connectDevice,因此connectDevice 的通信方式再此跟蹤下:

frameworks\av\camera\aidl\android\hardware\ICameraService.aidl

/**

* Open a camera device through the new camera API

* Only supported for device HAL versions >= 3.2

*/

ICameraDeviceUser connectDevice(ICameraDeviceCallbacks callbacks,

String cameraId,

String opPackageName,

int clientUid);

aidl_java.png

aidl_java2.png

服務(wù)端實(shí)現(xiàn)此函數(shù)收到函數(shù)請求,如下:

class BpCameraService : public ::android::BpInterface {

public:

explicit BpCameraService(const ::android::sp<::android::ibinder>& _aidl_impl);

virtual ~BpCameraService() = default;

::android::binder::Status getNumberOfCameras(int32_t type, int32_t* _aidl_return) override;

::android::binder::Status getCameraInfo(int32_t cameraId, ::android::hardware::CameraInfo* _aidl_return) override;

::android::binder::Status connect(const ::android::sp<::android::hardware::icameraclient>& client, int32_t cameraId, const ::android::String16& opPackageName, int32_t cl

::android::binder::Status connectDevice(const ::android::sp<::android::hardware::camera2::icameradevicecallbacks>& callbacks, const ::android::String16& cameraId, const

::android::binder::Status connectLegacy(const ::android::sp<::android::hardware::icameraclient>& client, int32_t cameraId, int32_t halVersion, const ::android::String16&

::android::binder::Status addListener(const ::android::sp<::android::hardware::icameraservicelistener>& listener, ::std::vector<::android::hardware::camerastatus>* _aidl

::android::binder::Status removeListener(const ::android::sp<::android::hardware::icameraservicelistener>& listener) override;

::android::binder::Status getCameraCharacteristics(const ::android::String16& cameraId, ::android::hardware::camera2::impl::CameraMetadataNative* _aidl_return) override;

::android::binder::Status getCameraVendorTagDescriptor(::android::hardware::camera2::params::VendorTagDescriptor* _aidl_return) override;

::android::binder::Status getCameraVendorTagCache(::android::hardware::camera2::params::VendorTagDescriptorCache* _aidl_return) override;

::android::binder::Status getLegacyParameters(int32_t cameraId, ::android::String16* _aidl_return) override;

::android::binder::Status supportsCameraApi(const ::android::String16& cameraId, int32_t apiVersion, bool* _aidl_return) override;

::android::binder::Status setTorchMode(const ::android::String16& cameraId, bool enabled, const ::android::sp<::android::ibinder>& clientBinder) override;

::android::binder::Status notifySystemEvent(int32_t eventId, const ::std::vector& args) override;

}; // class BpCameraService

}

services2.png

Status CameraService::connectDevice(

const sp<:camera2::icameradevicecallbacks>& cameraCb,

const String16& cameraId,

const String16& clientPackageName,

int clientUid,

/*out*/

sp<:camera2::icameradeviceuser>* device) {

ATRACE_CALL();

Status ret = Status::ok();

String8 id = String8(cameraId);

sp client = nullptr;

ret = connectHelper<:camera2::icameradevicecallbacks>(cameraCb, id,

CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName,

clientUid, USE_CALLING_PID, API_2,

/*legacyMode*/ false, /*shimUpdateOnly*/ false,

/*out*/client);

if(!ret.isOk()) {

logRejected(id, getCallingPid(), String8(clientPackageName),

ret.toString8());

return ret;

}

String8 pid = String8::format("%d", getCallingPid());

POWERPUSH(129, clientName8.string(), id.string(), pid.string());//define in LogPower.java, 129 stand for camera start now

*device = client;

//add for send msg to nfc

char needSendMsg[255];

property_get("ro.config.hw_camera_nfc_switch",needSendMsg,"");

ALOGI("NFC polling %s", needSendMsg);

if (0 == strcmp(needSendMsg, "true")) {

String8 isOpen = String8::format("false");

android::allowNfcPolling(isOpen);

}

ALOGI("%s(), exit.", __FUNCTION__);

return ret;

}

簡單捋順下調(diào)用過程:

CameraManager.Java的connectDevice ? ICameraService.java(系統(tǒng)編譯)的onTransact-?

ICameraService.cpp(系統(tǒng)編譯)的BpCameraService::connectDevice()?ICameraService.cpp(系統(tǒng)編譯)的::android::status_t BnCameraService::onTransact-?

CameraService.cpp的CameraService::connectDevice()

APP 進(jìn)程在打開之后就等待nataive 層運(yùn)行結(jié)束,native層直到上節(jié)分析的創(chuàng)建成功

CameraDevice對象之后由CameraManager進(jìn)行給java層的CameraDeviceIml 設(shè)置

setRemoteDevice,APP進(jìn)程打開設(shè)備成功,得到了framework給到的CameraDeviceIml對象,可以后續(xù)通過此對Camera進(jìn)行操作

總結(jié)

以上是生活随笔為你收集整理的android sse 人脸识别,基于Android Camera2之openCamera 流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

日本精品va在线观看 | 欧美午夜精品久久久久 | 国产拍在线 | 最新真实国产在线视频 | 久久国产欧美日韩 | 2023国产精品自产拍在线观看 | av在线亚洲天堂 | 伊人久久国产精品 | 成年人视频免费在线播放 | 亚洲精品国产综合99久久夜夜嗨 | 午夜色站| 97超碰人人澡人人爱 | 久久久久女教师免费一区 | 久久字幕网 | 日本高清中文字幕有码在线 | 成人久久久精品国产乱码一区二区 | 亚洲精品在线一区二区三区 | 草久久久久久 | 亚洲免费av观看 | 蜜臀久久99精品久久久酒店新书 | 国产精品视频全国免费观看 | 六月色丁香 | 久久久久久久福利 | 一级黄色毛片 | 91秒拍国产福利一区 | 日韩欧美视频免费在线观看 | 国产剧在线观看片 | 最新日韩在线 | 国产精品一二 | av成人免费观看 | 色狠狠久久av五月综合 | 亚洲va在线va天堂va偷拍 | 中文字幕视频免费观看 | 91在线精品秘密一区二区 | 一区二区中文字幕在线观看 | 色综合激情久久 | 免费在线观看av片 | 亚洲日日射 | 国产欧美综合在线观看 | 一区二区三区观看 | 在线 高清 中文字幕 | 国产亚洲精品久久久久久久久久久久 | 青青河边草手机免费 | 五月婷在线| 永久免费精品视频网站 | 狠狠色狠狠综合久久 | 精品久久五月天 | 国产精品手机在线播放 | 久久人人爽人人爽人人片av免费 | 91 中文字幕 | 国产成人精品福利 | 不卡的av在线 | 国产成人精品一区一区一区 | 亚洲欧洲精品一区二区精品久久久 | 亚洲综合在线发布 | 久久人91精品久久久久久不卡 | 91麻豆国产福利在线观看 | 在线观看亚洲国产精品 | 最近中文字幕 | 99综合久久| 91视频免费看片 | 激情欧美丁香 | 久久另类小说 | 午夜视频在线瓜伦 | 亚洲天堂网视频 | 精品国产一区二区三区蜜臀 | 国产亚洲精品美女 | 中文在线最新版天堂 | 免费在线观看国产黄 | 91在线亚洲 | 日本在线精品视频 | 久久午夜精品影院一区 | 久久精品综合 | 伊甸园av在线 | 色视频在线观看 | 亚洲午夜精品一区二区三区电影院 | 国产精品国产三级国产aⅴ无密码 | 婷婷在线色 | 国产亚洲精品久久久久久久久久 | 午夜视频久久久 | 最新日韩电影 | 国产精品18久久久 | 色综合夜色一区 | 91亚洲精品久久久久图片蜜桃 | 97碰视频| 国产亚洲一区二区三区 | 99色在线观看 | 国产亚洲情侣一区二区无 | 日韩激情视频在线 | 日韩精品电影在线播放 | 干av在线 | 精品一区久久 | 久久人人爽人人片 | 亚洲国产精品第一区二区 | 三上悠亚一区二区在线观看 | 国产精彩视频一区二区 | 中文字幕免费在线看 | 色婷婷视频在线 | 久久久精品99 | 成人免费视频网站 | 97视频人人 | 精品国产一区二区三区四区vr | 日日干av | 97夜夜澡人人爽人人免费 | 成人三级网站在线观看 | 黄色综合 | 日韩国产精品久久 | 91传媒免费观看 | 激情久久伊人 | 99热这里只有精品在线观看 | 日韩午夜剧场 | 999久久久免费视频 午夜国产在线观看 | 国产在线国偷精品产拍免费yy | 91在线麻豆| 天天操天天干天天爽 | 亚洲精品视频在线观看免费视频 | 日韩手机在线观看 | 韩国av免费观看 | 国产在线精品区 | а天堂中文最新一区二区三区 | 黄色在线观看免费网站 | 九九欧美 | 久久人人爽人人人人片 | 欧美精品v国产精品v日韩精品 | 精品视频在线观看 | 亚洲乱码精品久久久久 | 精品国产色 | 99久久精 | 伊人伊成久久人综合网站 | 久久精品在线免费观看 | 超碰免费97| 精品黄色片| 综合激情婷婷 | www.99av| a一片一级 | 日韩精品中文字幕一区二区 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 美女视频黄免费的 | 国产一区欧美二区 | 精品9999| 欧美另类重口 | 日韩网站在线观看 | 国产又粗又猛又色 | 亚洲国产网站 | 97香蕉超级碰碰久久免费软件 | 人人草天天草 | 国产精品福利在线播放 | 亚洲精品一区二区三区新线路 | 欧美日韩免费观看一区=区三区 | free,性欧美 九九交易行官网 | 伊人开心激情 | 日韩手机在线观看 | 色片网站在线观看 | 国产成人精品亚洲日本在线观看 | 欧美性生活一级片 | 天天综合中文 | 亚洲免费成人av电影 | 五月综合网 | 日本女人在线观看 | 欧美一区二区免费在线观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产精品2018 | 97色在线观看免费视频 | 伊人久久婷婷 | 亚洲黄色大片 | 久久婷婷一区 | 91精品免费 | 日韩成人精品一区二区三区 | 91精品久久久久久综合乱菊 | 亚洲美女久久 | www.五月激情.com | 草久久影院 | 天天骚夜夜操 | 99中文字幕在线观看 | 日本成人免费在线观看 | 亚洲资源片| 国产一区不卡在线 | 99热这里只有精品在线观看 | 在线播放视频一区 | 亚洲经典在线 | 精品一区二区在线观看 | 高清在线一区二区 | 91av大全| 欧美人牲 | 成人性生交大片免费看中文网站 | 中文字幕久久精品亚洲乱码 | 日日色综合 | 国产在线观看黄 | 亚洲一级黄色大片 | 国产日韩中文字幕 | 色视频在线免费 | 免费观看黄 | 国产亚洲激情视频在线 | 天天干天天操天天 | 激情av资源网 | 丁香高清视频在线看看 | 免费看日韩 | 欧美日韩在线免费观看 | 成人国产精品久久久久久亚洲 | 久久久.com| 黄色一级片视频 | 亚洲电影毛片 | 九九色综合 | 日韩经典一区二区三区 | 99精品国产福利在线观看免费 | 丁香视频 | 欧美日韩在线观看一区二区三区 | www.xxxx欧美| 日韩丝袜 | 国产成人免费观看久久久 | 国产视频一区在线播放 | 精品国产91亚洲一区二区三区www | 黄色小说在线观看视频 | 激情伊人 | 中国一级片在线播放 | 欧美日韩在线观看一区二区三区 | 国产99久久久国产精品免费看 | 久精品视频在线 | zzijzzij亚洲日本少妇熟睡 | 麻豆成人在线观看 | 91在线视频免费播放 | 久久久九色精品国产一区二区三区 | 日韩a在线观看 | 五月天婷婷免费视频 | 精品久久片 | 91av中文 | 在线性视频日韩欧美 | 在线国产一区二区 | 六月色丁香 | 中文字幕91在线 | 成人av直播| 色婷婷av一区二 | 日日夜夜免费精品视频 | 日本最新高清不卡中文字幕 | 久久久免费看 | 久久av免费 | 国产精品免费久久久久久久久久中文 | 亚洲伊人第一页 | www日日| 欧美极品少妇xbxb性爽爽视频 | 国产精品精品国产色婷婷 | 日韩在线免费观看视频 | 99久久婷婷国产一区二区三区 | 手机看国产毛片 | 久久久久久久久久久福利 | 国产精品美乳一区二区免费 | 西西44人体做爰大胆视频 | www.亚洲精品在线 | 国产精品美女久久久 | 久久99国产精品二区护士 | 日韩av片免费在线观看 | 在线视频在线观看 | 成人黄色毛片 | 99色人| 日韩在线观看a | 日韩乱码在线 | 国产成人精品综合 | 亚洲香蕉在线观看 | 亚洲aaa级 | 欧美成年黄网站色视频 | 亚洲精品99久久久久中文字幕 | 网站你懂的 | 国产视频精品久久 | 亚洲精品中文字幕在线观看 | 中文字幕 欧美性 | 免费网址在线播放 | 欧美xxxxx在线视频 | 国产成人综合图片 | 久久久久9999亚洲精品 | 日韩在线视频观看 | 91香蕉视频在线 | 国内精品久久久久影院男同志 | 蜜臀久久99精品久久久无需会员 | 在线精品播放 | 色姑娘综合网 | 免费的国产精品 | 嫩小bbbb摸bbb摸bbb | 射久久久 | 久草在线免费电影 | 黄色小说视频网站 | 日韩免费观看一区二区 | 国产精品av免费 | 欧美一区二区三区免费观看 | 国产九九九精品视频 | av网站免费在线 | 日韩av在线不卡 | 黄a网站| 国产麻豆视频网站 | 免费三级黄 | 婷婷在线视频观看 | 国产视频精品在线 | 97视频人人澡人人爽 | 天天操夜操视频 | 国产精品久久久久久五月尺 | 国产精品一区二区久久国产 | 最新高清无码专区 | 国产在线观看国语版免费 | 99久久久国产免费 | 手机av在线不卡 | 天天搞天天干天天色 | 欧美一级片在线 | 国产精品网在线观看 | 日日干 天天干 | 日韩av看片| 日本三级在线观看中文字 | av在线在线 | 91| 一区二区中文字幕在线观看 | 久久99精品久久久久婷婷 | 国产美女黄网站免费 | 免费日韩视 | av黄色亚洲 | 欧美91片 | 二区中文字幕 | 欧美成人影音 | 天天夜夜操| 91麻豆文化传媒在线观看 | 日韩在线免费播放 | 婷婷综合亚洲 | 欧美日韩在线精品一区二区 | 在线91精品 | 国产午夜一区二区 | 美女久久久久久久久久久 | 在线观看中文字幕2021 | 国产高清一区二区 | 国产欧美在线一区二区三区 | 韩国av一区二区三区 | 久久看毛片 | 美女黄频在线观看 | 久久久视屏 | 97超碰在线免费观看 | 国产福利一区二区三区视频 | 亚洲精品字幕在线 | 欧美成年黄网站色视频 | 天天操天天干天天插 | 国产香蕉97碰碰碰视频在线观看 | 91久久国产自产拍夜夜嗨 | 久久视频免费在线 | 天天色欧美| 国产99自拍| av免费在线看网站 | 日本一区二区高清不卡 | 久久免费精彩视频 | 国产成人免费高清 | 激情久久五月天 | 久久精品国产99 | 青青河边草免费直播 | 在线观看视频一区二区三区 | 96久久久 | 国产精品亚洲片在线播放 | 啪啪精品 | 毛片网站在线 | 99成人免费视频 | 亚洲永久av| 成人app在线播放 | 欧美极品在线播放 | 国产精品成人a免费观看 | 国产精品成人a免费观看 | 国产xxxx性hd极品 | 国产精品av电影 | 2024国产精品视频 | 色资源网免费观看视频 | 九色91av| 色婷婷亚洲 | 日韩免费网址 | 国产精品免费一区二区三区在线观看 | 国产婷婷视频在线 | 色播五月激情综合网 | 欧美亚洲三级 | 国产精品一区二区在线免费观看 | 狠狠操.com | 亚洲精品男人天堂 | 国产精品视频免费在线观看 | 国产伦精品一区二区三区… | www亚洲一区| 国产精品一二 | 婷婷精品国产一区二区三区日韩 | 久久影院精品 | 在线观看中文av | 97电影网手机版 | 国产成人一区二区三区影院在线 | 麻豆精品视频 | 欧美一级片免费观看 | 久久久久亚洲精品男人的天堂 | 四虎天堂 | 日韩精品一区二区免费 | 日本中文字幕在线看 | 日韩免费在线网站 | 久久一区二区三区国产精品 | 狠狠狠色丁香综合久久天下网 | 国产九九热 | 国产91精品看黄网站 | 亚洲成人免费在线观看 | 国产精品短视频 | 国产夫妻性生活自拍 | 国产精品区一区 | 色黄www小说 | 探花系列在线 | 91av免费看 | 午夜精品一区二区三区视频免费看 | 日韩在线视频播放 | 91探花国产综合在线精品 | 婷婷丁香花 | 在线观看日本韩国电影 | 99热这里只有精品国产首页 | 深爱激情婷婷网 | 亚洲作爱 | 91视频在线免费下载 | 欧美一区二区免费在线观看 | 碰超在线观看 | 久久久久欠精品国产毛片国产毛生 | 美女久久久久久久久久久 | 免费在线播放av电影 | 午夜av免费在线观看 | 香蕉视频一级 | 久久成人一区二区 | 热久久视久久精品18亚洲精品 | 成 人 黄 色 视频免费播放 | 精品在线免费视频 | 中文字幕av最新 | 在线观看免费高清视频大全追剧 | av中文字幕在线看 | 激情综合亚洲 | 在线色资源 | 日韩黄色免费看 | 欧美 日韩 国产 成人 在线 | www五月 | 又黄又爽又无遮挡免费的网站 | 中文字幕免费国产精品 | 久色婷婷 | 国产一区二区三区免费视频 | www国产一区 | 91免费观看 | 日本中文字幕在线看 | 久久伊人国产精品 | 国产一区二区网址 | 免费成人看片 | 久久午夜影院 | 九九九九免费视频 | 欧美日韩国产在线一区 | 精品99久久 | 人人澡人人模 | 国产精品a成v人在线播放 | 色av男人的天堂免费在线 | 在线观看av麻豆 | 日黄网站| 91理论片午午伦夜理片久久 | 99视频精品 | 日本性xxx | 丁香婷婷色综合亚洲电影 | 色.www| 亚洲综合在线五月天 | 国产夫妻性生活自拍 | 欧美午夜精品久久久久久浪潮 | 欧美做受高潮电影o | 久久久久久久久久亚洲精品 | 久久午夜色播影院免费高清 | 精品一区 精品二区 | 成人黄色小视频 | 久久短视频 | 免费看成人a | 911国产在线观看 | 中文字幕日本在线观看 | free,性欧美 九九交易行官网 | 在线观看日韩中文字幕 | 日韩精品久久一区二区 | 国产一区二区午夜 | 在线视频 影院 | 免费亚洲片 | 丁香花在线观看视频在线 | 人人澡人人舔 | 成人av电影免费 | 国产999视频 | 日韩av高清 | 久热只有精品 | 婷婷亚洲综合五月天小说 | 99视频精品免费观看, | 亚洲激情电影在线 | 国产麻豆电影在线观看 | 青青河边草观看完整版高清 | 91视频久久久久 | 综合色天天 | 日韩欧美国产精品 | 69绿帽绿奴3pvideos | 91网址在线观看 | 男女免费av | 91精品国自产在线 | 欧美色综合天天久久综合精品 | 欧美日韩精品网站 | 久久久视频在线 | 国产剧情av在线播放 | 精品国产一区二区三区久久久 | 午夜久久美女 | 国产美女久久 | 青青河边草观看完整版高清 | 99热这里只有精品免费 | 草免费视频 | 丝袜美腿av| 天天视频亚洲 | 免费网站在线观看成人 | 亚洲国产经典视频 | 久久久精品欧美一区二区免费 | 一区精品在线 | 碰超人人 | 韩国三级在线一区 | 999电影免费在线观看2020 | 丁香六月综合网 | 亚洲欧洲精品一区二区精品久久久 | 亚洲影院色 | a电影免费看| 免费午夜视频在线观看 | 精品欧美一区二区精品久久 | 日日夜夜免费精品视频 | 成人av电影免费在线播放 | 亚洲综合视频在线播放 | 国产精品视频app | 99久久久成人国产精品 | 久久久久久国产一区二区三区 | 丁香激情综合久久伊人久久 | 97人人澡人人爽人人模亚洲 | 黄色大全在线观看 | 久草在线免费新视频 | 国产不卡视频在线 | 又粗又长又大又爽又黄少妇毛片 | 亚洲一区二区三区在线看 | 国外调教视频网站 | 国产一级片免费视频 | 天天综合导航 | 97超碰人人爱 | 色综合a | 99久久精品视频免费 | 天天操天天操天天操天天操天天操 | 91自拍成人| 日韩欧美一区二区不卡 | 亚洲日韩精品欧美一区二区 | 天天干,天天操,天天射 | 国产精品国产精品 | 波多野结衣小视频 | 日日草天天草 | 久久伊人综合 | 99久久激情| 69久久99精品久久久久婷婷 | 免费高清av在线看 | 日韩在线观看视频一区二区三区 | 91亚洲精品在线观看 | 91色欧美| 久久高清毛片 | 91成年人在线观看 | 国产aa免费视频 | a在线观看免费视频 | 久久草草热国产精品直播 | 操处女逼 | 国产一级黄色av | 国产精品门事件 | 欧美日韩国产精品久久 | av免费看网站| 日本论理电影 | 最近中文字幕mv | 天天色天天干天天色 | 成人黄色电影在线观看 | 国产精品免费视频一区二区 | 一区三区视频在线观看 | 丁香五月亚洲综合在线 | 久草99 | 青春草视频在线播放 | 91在线视频导航 | 五月婷网站 | 成人97视频 | 国产色区| www五月天com | 一区二区三区 中文字幕 | 国产精品国产三级国产 | 亚洲人成免费网站 | 性色av一区二区三区在线观看 | 免费视频你懂得 | 精品久久久久久亚洲综合网站 | 中中文字幕av在线 | 国产亚洲精品xxoo | 丝袜美腿亚洲 | 欧美一级在线 | 免费亚洲视频 | 日产中文字幕 | 狂野欧美激情性xxxx欧美 | 国产精品久久久久永久免费看 | 99在线观看精品 | 中文字幕精 | 国产剧情一区二区 | 久久久久国产成人免费精品免费 | 欧美一区二区在线免费看 | ,久久福利影视 | 日韩大片免费观看 | www色网站| av电影久久| 日韩在线三级 | 日韩在线观看小视频 | 日日夜夜天天久久 | 开心激情网五月天 | 国产理论影院 | 最新中文在线视频 | 亚洲一级片在线观看 | 久久国产欧美日韩精品 | 亚洲精品综合一二三区在线观看 | 热久久视久久精品18亚洲精品 | 国产精品一区二区中文字幕 | 亚洲成人午夜在线 | 五月婷婷一区 | 国产一区二区在线播放视频 | 超碰午夜 | 麻豆国产精品视频 | 国产99免费视频 | 婷婷在线免费观看 | 中文国产成人精品久久一 | 一级全黄毛片 | 久久久久网站 | 中文字幕一区三区 | 亚洲黄电影| 亚洲精品免费在线观看视频 | 狠狠躁天天躁 | 国产亚洲精品久久久久久大师 | 国产91精品在线播放 | 草久中文字幕 | 日韩高清在线一区二区三区 | 日日夜夜艹 | 国产手机在线视频 | 国产资源免费在线观看 | 亚洲成人一区 | 五月天婷婷丁香花 | 欧美激情第一区 | 亚洲国产中文字幕在线 | 日韩色在线观看 | 国产精品久久久久久影院 | 国产成人精品av在线观 | 国产精品video爽爽爽爽 | 婷婷去俺也去六月色 | 日本黄色免费在线观看 | 久久99久国产精品黄毛片入口 | 五月激情久久久 | 五月婷婷久久丁香 | 日日夜夜网站 | 日韩视频一区二区 | 国产精品美女网站 | 久久国产精品久久久 | 国产精品久久久久久久av电影 | 精品国产乱码久久 | 日本中文字幕影院 | 久久久久久高潮国产精品视 | av黄色亚洲| 天天色天天 | 国产一区二区三区高清播放 | 精品久久久久久久久久久久久久久久久久 | 亚洲激情网站免费观看 | 久久玖| 日韩精品中文字幕在线播放 | 日韩三级免费 | 精品91久久久久 | 日韩欧美综合视频 | 免费在线观看av网站 | 狠狠艹夜夜干 | 亚洲高清久久久 | 91福利社区在线观看 | 国产精品一区二区在线免费观看 | 久久免费视频观看 | 国产伦精品一区二区三区四区视频 | 在线观看视频你懂 | 国产成人亚洲在线观看 | 久久黄色片 | 深爱五月激情网 | 欧美在线视频一区二区三区 | 97超碰伊人 | 久久久久久久99精品免费观看 | 91插插插网站 | 日韩久久精品一区二区 | 在线蜜桃视频 | 欧美性色黄大片在线观看 | 色综合天天干 | 免费观看v片在线观看 | 免费观看不卡av | 日韩狠狠操 | 日韩在线一区二区免费 | av不卡免费在线观看 | 色妞色视频一区二区三区四区 | 视频二区 | 亚洲国产中文字幕 | 国产精品自产拍在线观看桃花 | 免费在线成人 | 欧美成人在线网站 | 亚洲成人黄色网址 | 精品亚洲网 | se视频网址 | 国产视频亚洲视频 | 亚洲视频在线看 | 激情综合中文娱乐网 | 天天操夜夜想 | av电影中文字幕在线观看 | 日韩精品不卡在线观看 | 亚洲精品天天 | 免费看片黄色 | 91网址在线观看 | 成人sm另类专区 | 国产精品成人自产拍在线观看 | 亚洲国产精品一区二区久久,亚洲午夜 | 国产高清视频免费在线观看 | 欧美日韩免费观看一区=区三区 | 99性视频 | 免费的国产精品 | 丁香五月缴情综合网 | 免费黄在线看 | 在线观看视频一区二区三区 | 天天草天天插 | 在线观看视频在线观看 | 奇米影视8888在线观看大全免费 | 人人澡超碰碰 | 日韩中文字幕亚洲一区二区va在线 | 国产精品成人久久久久 | 国产亚洲精品日韩在线tv黄 | 免费观看成人 | 精品一区在线看 | 有码中文字幕 | 欧美日韩国产色综合一二三四 | 久久人人97超碰精品888 | 国产91探花 | 在线成人欧美 | 91精品一区二区三区久久久久久 | 欧美做受高潮1 | 91精品国产福利在线观看 | 国产又粗又猛又黄又爽 | 91精品一区国产高清在线gif | 怡红院成人在线 | 久久夜色精品国产欧美一区麻豆 | 999成人| 免费在线观看中文字幕 | 国产精品黄网站在线观看 | 国产高清在线永久 | 国产一级片一区二区三区 | 天天综合导航 | 在线成人小视频 | 国产高清视频免费在线观看 | 精品国产一二三 | 久久婷婷一区 | 久久黄色片子 | 91精品视频免费在线观看 | 99久久国产免费免费 | 中文一区在线观看 | 福利一区二区 | 日韩有码在线播放 | 国产一区二区手机在线观看 | av免费在线播放 | 亚洲mv大片欧洲mv大片免费 | 国产无套精品久久久久久 | 免费av网址在线观看 | www.日本色 | 久热精品国产 | 免费看黄视频 | 国产盗摄精品一区二区 | 六月丁香激情综合色啪小说 | 国产高清绿奴videos | 亚洲精品在线免费看 | 麻豆国产网站入口 | 成人av日韩| 丁香伊人网 | 91污视频在线观看 | 国产人免费人成免费视频 | 三级午夜片 | 少妇自拍av| 国产精品久久三 | 27xxoo无遮挡动态视频 | 国产高清免费 | 亚洲视频免费 | 日韩精品一区在线播放 | 999在线视频 | 手机在线日韩视频 | 最近日本中文字幕 | 四虎永久免费网站 | 免费黄色av | 激情网在线视频 | 夜夜躁狠狠躁日日躁视频黑人 | 精品夜夜嗨av一区二区三区 | 国产又粗又硬又爽视频 | 日韩av手机在线观看 | 毛片网站在线看 | 夜夜操天天干, | 亚洲一区二区三区精品在线观看 | 国产免费一区二区三区网站免费 | 91九色蝌蚪视频 | 五月天色站 | 久草免费在线观看视频 | 一区中文字幕电影 | www.久久91 | 91一区在线观看 | 91福利视频免费观看 | 国产精品黄色影片导航在线观看 | 一区二区三区免费在线观看 | av片免费播放 | 国产精品剧情在线亚洲 | 国产高清一区二区 | 一区二区视频播放 | 中文字幕在线观看免费观看 | 国产99久久久国产精品成人免费 | 黄色av电影免费观看 | 四虎国产永久在线精品 | 中文字幕美女免费在线 | 天天插夜夜操 | 亚洲精品久久久蜜桃直播 | 国产黄色精品在线 | 国产91免费观看 | 国产精品视频最多的网站 | 国产麻豆电影在线观看 | 很黄很黄的网站免费的 | 六月丁香婷婷久久 | 亚洲一级片在线观看 | 久久久久国产视频 | av片在线观看 | 欧美性生活免费 | 九九热精品视频在线播放 | 欧美伊人网 | 最新av网址在线观看 | 国产精品 中文在线 | 欧美精品二区 | 久久免费美女视频 | 女人18毛片a级毛片一区二区 | 91看片麻豆| 精品国产一区二区三区四区在线观看 | 免费观看国产视频 | 中文字幕欧美日韩va免费视频 | 中文在线免费视频 | 三级黄色免费 | 亚洲伦理一区二区 | 精品国产精品久久 | 色www永久免费 | 四虎国产永久在线精品 | av高清影院| 亚洲欧洲精品一区 | 久久艹综合 | 免费手机黄色网址 | a色视频| 国产在线精品一区 | 亚洲国产激情 | 国产99久久精品一区二区300 | 国产精品国产三级国产aⅴ9色 | 国产精品久久嫩一区二区免费 | 国产精品成人品 | 夜色成人网| 亚洲一区二区三区四区在线视频 | 三级毛片视频 | 6080yy精品一区二区三区 | av在线播放网址 | 亚洲资源片 | av7777777| 国产性xxxx | 五月综合网 | 97人人澡人人爽人人模亚洲 | 二区三区在线视频 | 黄色av网站在线观看 | 色婷婷综合成人av | av日韩国产| 91视频最新网址 | 成人av地址 | 精品国产大片 | 91久久国产综合精品女同国语 | 亚洲少妇自拍 | 久久久2o19精品 | 色诱亚洲精品久久久久久 | 亚洲区视频在线观看 | 久草观看| 干综合网| av黄色亚洲| 黄色成人av | 欧美日韩精品网站 | 黄色日批网站 | 97涩涩视频 | 国产破处精品 | 三上悠亚在线免费 | 国产无遮挡猛进猛出免费软件 | 一区精品久久 | 成人精品一区二区三区电影免费 | 黄色字幕网 | 91午夜精品 | 99视频99 | 五月导航 | 中文在线天堂资源 | 国产一区二区精品在线 | 色婷婷综合在线 | 免费看的黄色 | 在线看日韩| 精品久久久久亚洲 | 99久久久久国产精品免费 | 日韩在线观看电影 | 91爱在线 | 亚洲清纯国产 | 青青河边草观看完整版高清 | 激情 亚洲 | 亚洲精品福利在线 | 伊人午夜 | 日韩视频免费 | 亚洲日本va在线观看 | 日韩欧美视频二区 | 麻豆91视频 | 久久免费黄色大片 | 日韩精品视频网站 | 国产精品成人av久久 | 五月色婷 | 国模精品一区二区三区 | 久久久久成人精品免费播放动漫 | 国产在线观看,日本 | 久久视频免费观看 | 成人久久18免费网站 | av电影一区| 啪啪小视频网站 | www.人人干| 国产成人精品亚洲精品 | 久久精品久久国产 | 丰满少妇对白在线偷拍 | 亚洲欧美色婷婷 | 91精品国产乱码久久 | 国产啊v在线观看 | 久久国产成人午夜av影院宅 | 日韩激情视频在线观看 | 久草网站 | 国产自产在线视频 | 久久精品中文字幕一区二区三区 | 精品一二三四五区 | 国产精品一区二区白浆 | 国产成人高清 | 成人午夜免费福利 | 亚洲黄色在线看 | 国产精品一区二区三区在线免费观看 | 成人丝袜| 国产一区影院 | 亚洲美女免费视频 | 97视频在线观看视频免费视频 | 在线91视频 | 亚洲午夜精品一区二区三区电影院 | 亚洲国产中文字幕 | 天天鲁天天干天天射 | 超碰在线人人草 | 九九在线免费视频 | 国产午夜精品一区二区三区嫩草 | 成人在线视频观看 | 狠狠狠操| 激情婷婷久久 | 黄色小说在线免费观看 | 国产婷婷视频在线 | 成人网444ppp | 人人看人人做人人澡 | 国产精品18毛片一区二区 | 丁香婷婷深情五月亚洲 | 久久综合狠狠狠色97 | 欧美性做爰猛烈叫床潮 | 久久精品视频免费 | 日韩国产精品一区 | 97精品国产91久久久久久 | 国产最新91 | www.啪啪.com| 国产成人免费网站 | 午夜黄色影院 | 婷婷色综合色 | 国产亚洲精品综合一区91 | 久久手机免费观看 | 久久激情久久 | 日日夜夜狠狠操 | 欧美成人影音 | 久久精品视频在线 | 国内精品小视频 | 97超视频免费观看 | 91cn国产在线 | 国产精品尤物 | 久久久久国产精品一区二区 | 久久99精品一区二区三区三区 | 久草网站在线观看 | 亚洲国内在线 | 美女国产免费 | 国产一区久久久 | 国产又粗又猛又黄又爽视频 | 欧美极度另类 | 91精品视屏| 五月婷婷综合激情网 | 又黄又刺激 | 四虎影视精品永久在线观看 | 97超碰人人| 免费看成年人 | 日韩色爱| 日日操天天爽 | 高清精品在线 | 福利区在线观看 | 97在线观看免费观看高清 | 狠狠狠狠狠狠狠狠 | 久草视频在线播放 | 午夜精品一区二区三区在线观看 | 久久五月婷婷丁香 | 国产亚洲欧美日韩高清 | 免费中文字幕 | 国产精品久久久久久久久久久杏吧 | 不卡av在线 | 在线观看免费 | 超碰97网站| 欧美日韩成人 | 亚洲精品一区二区三区四区高清 | 波多野结衣在线观看一区 |