@ -732,9 +732,10 @@ Status CameraService::filterGetInfoErrorCode(status_t err) {
}
}
Status CameraService : : makeClient ( const sp < CameraService > & cameraService ,
Status CameraService : : makeClient ( const sp < CameraService > & cameraService ,
const sp < IInterface > & cameraCb , const String16 & packageName , const String8 & cameraId ,
const sp < IInterface > & cameraCb , const String16 & packageName ,
int api1CameraId , int facing , int clientPid , uid_t clientUid , int servicePid ,
const std : : unique_ptr < String16 > & featureId , const String8 & cameraId , int api1CameraId ,
int halVersion , int deviceVersion , apiLevel effectiveApiLevel ,
int facing , int clientPid , uid_t clientUid , int servicePid , int halVersion ,
int deviceVersion , apiLevel effectiveApiLevel ,
/*out*/ sp < BasicClient > * client ) {
/*out*/ sp < BasicClient > * client ) {
if ( halVersion < 0 | | halVersion = = deviceVersion ) {
if ( halVersion < 0 | | halVersion = = deviceVersion ) {
@ -744,7 +745,7 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
case CAMERA_DEVICE_API_VERSION_1_0 :
case CAMERA_DEVICE_API_VERSION_1_0 :
if ( effectiveApiLevel = = API_1 ) { // Camera1 API route
if ( effectiveApiLevel = = API_1 ) { // Camera1 API route
sp < ICameraClient > tmp = static_cast < ICameraClient * > ( cameraCb . get ( ) ) ;
sp < ICameraClient > tmp = static_cast < ICameraClient * > ( cameraCb . get ( ) ) ;
* client = new CameraClient ( cameraService , tmp , packageName ,
* client = new CameraClient ( cameraService , tmp , packageName , featureId ,
api1CameraId , facing , clientPid , clientUid ,
api1CameraId , facing , clientPid , clientUid ,
getpid ( ) ) ;
getpid ( ) ) ;
} else { // Camera2 API route
} else { // Camera2 API route
@ -762,15 +763,15 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
case CAMERA_DEVICE_API_VERSION_3_5 :
case CAMERA_DEVICE_API_VERSION_3_5 :
if ( effectiveApiLevel = = API_1 ) { // Camera1 API route
if ( effectiveApiLevel = = API_1 ) { // Camera1 API route
sp < ICameraClient > tmp = static_cast < ICameraClient * > ( cameraCb . get ( ) ) ;
sp < ICameraClient > tmp = static_cast < ICameraClient * > ( cameraCb . get ( ) ) ;
* client = new Camera2Client ( cameraService , tmp , packageName ,
* client = new Camera2Client ( cameraService , tmp , packageName , featureId ,
cameraId , api1CameraId ,
cameraId , api1CameraId ,
facing , clientPid , clientUid ,
facing , clientPid , clientUid ,
servicePid ) ;
servicePid ) ;
} else { // Camera2 API route
} else { // Camera2 API route
sp < hardware : : camera2 : : ICameraDeviceCallbacks > tmp =
sp < hardware : : camera2 : : ICameraDeviceCallbacks > tmp =
static_cast < hardware : : camera2 : : ICameraDeviceCallbacks * > ( cameraCb . get ( ) ) ;
static_cast < hardware : : camera2 : : ICameraDeviceCallbacks * > ( cameraCb . get ( ) ) ;
* client = new CameraDeviceClient ( cameraService , tmp , packageName , camera Id,
* client = new CameraDeviceClient ( cameraService , tmp , packageName , feature Id,
facing, clientPid , clientUid , servicePid ) ;
cameraId, facing, clientPid , clientUid , servicePid ) ;
}
}
break ;
break ;
default :
default :
@ -787,7 +788,7 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
halVersion = = CAMERA_DEVICE_API_VERSION_1_0 ) {
halVersion = = CAMERA_DEVICE_API_VERSION_1_0 ) {
// Only support higher HAL version device opened as HAL1.0 device.
// Only support higher HAL version device opened as HAL1.0 device.
sp < ICameraClient > tmp = static_cast < ICameraClient * > ( cameraCb . get ( ) ) ;
sp < ICameraClient > tmp = static_cast < ICameraClient * > ( cameraCb . get ( ) ) ;
* client = new CameraClient ( cameraService , tmp , packageName ,
* client = new CameraClient ( cameraService , tmp , packageName , featureId ,
api1CameraId , facing , clientPid , clientUid ,
api1CameraId , facing , clientPid , clientUid ,
servicePid ) ;
servicePid ) ;
} else {
} else {
@ -887,7 +888,7 @@ Status CameraService::initializeShimMetadata(int cameraId) {
if ( ! ( ret = connectHelper < ICameraClient , Client > (
if ( ! ( ret = connectHelper < ICameraClient , Client > (
sp < ICameraClient > { nullptr } , id , cameraId ,
sp < ICameraClient > { nullptr } , id , cameraId ,
static_cast < int > ( CAMERA_HAL_API_VERSION_UNSPECIFIED ) ,
static_cast < int > ( CAMERA_HAL_API_VERSION_UNSPECIFIED ) ,
internalPackageName , uid, USE_CALLING_PID ,
internalPackageName , std: : unique_ptr < String16 > ( ) , uid, USE_CALLING_PID ,
API_1 , /*shimUpdateOnly*/ true , /*out*/ tmp )
API_1 , /*shimUpdateOnly*/ true , /*out*/ tmp )
) . isOk ( ) ) {
) . isOk ( ) ) {
ALOGE ( " %s: Error initializing shim metadata: %s " , __FUNCTION__ , ret . toString8 ( ) . string ( ) ) ;
ALOGE ( " %s: Error initializing shim metadata: %s " , __FUNCTION__ , ret . toString8 ( ) . string ( ) ) ;
@ -1400,8 +1401,8 @@ Status CameraService::connect(
String8 id = cameraIdIntToStr ( api1CameraId ) ;
String8 id = cameraIdIntToStr ( api1CameraId ) ;
sp < Client > client = nullptr ;
sp < Client > client = nullptr ;
ret = connectHelper < ICameraClient , Client > ( cameraClient , id , api1CameraId ,
ret = connectHelper < ICameraClient , Client > ( cameraClient , id , api1CameraId ,
CAMERA_HAL_API_VERSION_UNSPECIFIED , clientPackageName , clientUid, clientPid , API_1 ,
CAMERA_HAL_API_VERSION_UNSPECIFIED , clientPackageName , std: : unique_ptr < String16 > ( ) ,
/*shimUpdateOnly*/ false , /*out*/ client ) ;
clientUid , clientPid , API_1 , /*shimUpdateOnly*/ false , /*out*/ client ) ;
if ( ! ret . isOk ( ) ) {
if ( ! ret . isOk ( ) ) {
logRejected ( id , CameraThreadState : : getCallingPid ( ) , String8 ( clientPackageName ) ,
logRejected ( id , CameraThreadState : : getCallingPid ( ) , String8 ( clientPackageName ) ,
@ -1427,8 +1428,8 @@ Status CameraService::connectLegacy(
Status ret = Status : : ok ( ) ;
Status ret = Status : : ok ( ) ;
sp < Client > client = nullptr ;
sp < Client > client = nullptr ;
ret = connectHelper < ICameraClient , Client > ( cameraClient , id , api1CameraId , halVersion ,
ret = connectHelper < ICameraClient , Client > ( cameraClient , id , api1CameraId , halVersion ,
clientPackageName , clientUid, USE_CALLING_PID , API_1 , /*shimUpdateOnly*/ false ,
clientPackageName , std: : unique_ptr < String16 > ( ) , clientUid, USE_CALLING_PID , API_1 ,
/* out*/client ) ;
/* shimUpdateOnly*/ false , /* out*/client ) ;
if ( ! ret . isOk ( ) ) {
if ( ! ret . isOk ( ) ) {
logRejected ( id , CameraThreadState : : getCallingPid ( ) , String8 ( clientPackageName ) ,
logRejected ( id , CameraThreadState : : getCallingPid ( ) , String8 ( clientPackageName ) ,
@ -1502,6 +1503,7 @@ Status CameraService::connectDevice(
const sp < hardware : : camera2 : : ICameraDeviceCallbacks > & cameraCb ,
const sp < hardware : : camera2 : : ICameraDeviceCallbacks > & cameraCb ,
const String16 & cameraId ,
const String16 & cameraId ,
const String16 & clientPackageName ,
const String16 & clientPackageName ,
const std : : unique_ptr < String16 > & clientFeatureId ,
int clientUid ,
int clientUid ,
/*out*/
/*out*/
sp < hardware : : camera2 : : ICameraDeviceUser > * device ) {
sp < hardware : : camera2 : : ICameraDeviceUser > * device ) {
@ -1511,6 +1513,7 @@ Status CameraService::connectDevice(
String8 id = String8 ( cameraId ) ;
String8 id = String8 ( cameraId ) ;
sp < CameraDeviceClient > client = nullptr ;
sp < CameraDeviceClient > client = nullptr ;
String16 clientPackageNameAdj = clientPackageName ;
String16 clientPackageNameAdj = clientPackageName ;
if ( hardware : : IPCThreadState : : self ( ) - > isServingCall ( ) ) {
if ( hardware : : IPCThreadState : : self ( ) - > isServingCall ( ) ) {
std : : string vendorClient =
std : : string vendorClient =
StringPrintf ( " vendor.client.pid<%d> " , CameraThreadState : : getCallingPid ( ) ) ;
StringPrintf ( " vendor.client.pid<%d> " , CameraThreadState : : getCallingPid ( ) ) ;
@ -1518,7 +1521,7 @@ Status CameraService::connectDevice(
}
}
ret = connectHelper < hardware : : camera2 : : ICameraDeviceCallbacks , CameraDeviceClient > ( cameraCb , id ,
ret = connectHelper < hardware : : camera2 : : ICameraDeviceCallbacks , CameraDeviceClient > ( cameraCb , id ,
/*api1CameraId*/ - 1 ,
/*api1CameraId*/ - 1 ,
CAMERA_HAL_API_VERSION_UNSPECIFIED , clientPackageNameAdj ,
CAMERA_HAL_API_VERSION_UNSPECIFIED , clientPackageNameAdj , clientFeatureId ,
clientUid , USE_CALLING_PID , API_2 , /*shimUpdateOnly*/ false , /*out*/ client ) ;
clientUid , USE_CALLING_PID , API_2 , /*shimUpdateOnly*/ false , /*out*/ client ) ;
if ( ! ret . isOk ( ) ) {
if ( ! ret . isOk ( ) ) {
@ -1533,8 +1536,9 @@ Status CameraService::connectDevice(
template < class CALLBACK , class CLIENT >
template < class CALLBACK , class CLIENT >
Status CameraService : : connectHelper ( const sp < CALLBACK > & cameraCb , const String8 & cameraId ,
Status CameraService : : connectHelper ( const sp < CALLBACK > & cameraCb , const String8 & cameraId ,
int api1CameraId , int halVersion , const String16 & clientPackageName , int clientUid ,
int api1CameraId , int halVersion , const String16 & clientPackageName ,
int clientPid , apiLevel effectiveApiLevel , bool shimUpdateOnly ,
const std : : unique_ptr < String16 > & clientFeatureId , int clientUid , int clientPid ,
apiLevel effectiveApiLevel , bool shimUpdateOnly ,
/*out*/ sp < CLIENT > & device ) {
/*out*/ sp < CLIENT > & device ) {
binder : : Status ret = binder : : Status : : ok ( ) ;
binder : : Status ret = binder : : Status : : ok ( ) ;
@ -1617,7 +1621,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&
}
}
sp < BasicClient > tmp = nullptr ;
sp < BasicClient > tmp = nullptr ;
if ( ! ( ret = makeClient ( this , cameraCb , clientPackageName ,
if ( ! ( ret = makeClient ( this , cameraCb , clientPackageName , clientFeatureId ,
cameraId , api1CameraId , facing ,
cameraId , api1CameraId , facing ,
clientPid , clientUid , getpid ( ) ,
clientPid , clientUid , getpid ( ) ,
halVersion , deviceVersion , effectiveApiLevel ,
halVersion , deviceVersion , effectiveApiLevel ,
@ -2459,13 +2463,14 @@ void CameraService::playSound(sound_kind kind) {
CameraService : : Client : : Client ( const sp < CameraService > & cameraService ,
CameraService : : Client : : Client ( const sp < CameraService > & cameraService ,
const sp < ICameraClient > & cameraClient ,
const sp < ICameraClient > & cameraClient ,
const String16 & clientPackageName ,
const String16 & clientPackageName ,
const std : : unique_ptr < String16 > & clientFeatureId ,
const String8 & cameraIdStr ,
const String8 & cameraIdStr ,
int api1CameraId , int cameraFacing ,
int api1CameraId , int cameraFacing ,
int clientPid , uid_t clientUid ,
int clientPid , uid_t clientUid ,
int servicePid ) :
int servicePid ) :
CameraService : : BasicClient ( cameraService ,
CameraService : : BasicClient ( cameraService ,
IInterface : : asBinder ( cameraClient ) ,
IInterface : : asBinder ( cameraClient ) ,
clientPackageName ,
clientPackageName , clientFeatureId ,
cameraIdStr , cameraFacing ,
cameraIdStr , cameraFacing ,
clientPid , clientUid ,
clientPid , clientUid ,
servicePid ) ,
servicePid ) ,
@ -2495,17 +2500,24 @@ sp<CameraService> CameraService::BasicClient::BasicClient::sCameraService;
CameraService : : BasicClient : : BasicClient ( const sp < CameraService > & cameraService ,
CameraService : : BasicClient : : BasicClient ( const sp < CameraService > & cameraService ,
const sp < IBinder > & remoteCallback ,
const sp < IBinder > & remoteCallback ,
const String16 & clientPackageName ,
const String16 & clientPackageName , const std : : unique_ptr < String16 > & clientFeatureId ,
const String8 & cameraIdStr , int cameraFacing ,
const String8 & cameraIdStr , int cameraFacing ,
int clientPid , uid_t clientUid ,
int clientPid , uid_t clientUid ,
int servicePid ) :
int servicePid ) :
mCameraIdStr ( cameraIdStr ) , mCameraFacing ( cameraFacing ) ,
mCameraIdStr ( cameraIdStr ) , mCameraFacing ( cameraFacing ) ,
mClientPackageName ( clientPackageName ) , mClientPid ( clientPid ) , mClientUid ( clientUid ) ,
mClientPackageName ( clientPackageName ) ,
mClientPid ( clientPid ) , mClientUid ( clientUid ) ,
mServicePid ( servicePid ) ,
mServicePid ( servicePid ) ,
mDisconnected ( false ) ,
mDisconnected ( false ) ,
mAudioRestriction ( hardware : : camera2 : : ICameraDeviceUser : : AUDIO_RESTRICTION_NONE ) ,
mAudioRestriction ( hardware : : camera2 : : ICameraDeviceUser : : AUDIO_RESTRICTION_NONE ) ,
mRemoteBinder ( remoteCallback )
mRemoteBinder ( remoteCallback )
{
{
if ( clientFeatureId ) {
mClientFeatureId = std : : unique_ptr < String16 > ( new String16 ( * clientFeatureId ) ) ;
} else {
mClientFeatureId = std : : unique_ptr < String16 > ( ) ;
}
if ( sCameraService = = nullptr ) {
if ( sCameraService = = nullptr ) {
sCameraService = cameraService ;
sCameraService = cameraService ;
}
}
@ -2649,8 +2661,9 @@ status_t CameraService::BasicClient::startCameraOps() {
int32_t res ;
int32_t res ;
mAppOpsManager - > startWatchingMode ( AppOpsManager : : OP_CAMERA ,
mAppOpsManager - > startWatchingMode ( AppOpsManager : : OP_CAMERA ,
mClientPackageName , mOpsCallback ) ;
mClientPackageName , mOpsCallback ) ;
res = mAppOpsManager - > startOpNoThrow ( AppOpsManager : : OP_CAMERA ,
res = mAppOpsManager - > startOpNoThrow ( AppOpsManager : : OP_CAMERA , mClientUid ,
mClientUid , mClientPackageName , /*startIfModeDefault*/ false ) ;
mClientPackageName , /*startIfModeDefault*/ false , mClientFeatureId ,
String16 ( " start camera " ) + String16 ( mCameraIdStr ) ) ;
if ( res = = AppOpsManager : : MODE_ERRORED ) {
if ( res = = AppOpsManager : : MODE_ERRORED ) {
ALOGI ( " Camera %s: Access for \" %s \" has been revoked " ,
ALOGI ( " Camera %s: Access for \" %s \" has been revoked " ,
@ -2692,7 +2705,7 @@ status_t CameraService::BasicClient::finishCameraOps() {
// Notify app ops that the camera is available again
// Notify app ops that the camera is available again
if ( mAppOpsManager ! = nullptr ) {
if ( mAppOpsManager ! = nullptr ) {
mAppOpsManager - > finishOp ( AppOpsManager : : OP_CAMERA , mClientUid ,
mAppOpsManager - > finishOp ( AppOpsManager : : OP_CAMERA , mClientUid ,
mClientPackageName );
mClientPackageName , mClientFeatureId );
mOpsActive = false ;
mOpsActive = false ;
}
}
// This function is called when a client disconnects. This should
// This function is called when a client disconnects. This should