MediaRecorderClient: Use checkService instead of getService for camera am: 58aef30341
am: 7273055732

Change-Id: Ib04f4d76e0d95a24210ddee9424a228b514f891b
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index 003418b..609b00d 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -368,14 +368,21 @@
     mRecorder->setListener(listener);
 
     sp<IServiceManager> sm = defaultServiceManager();
-    sp<IBinder> binder = sm->getService(String16("media.camera"));
 
+    // WORKAROUND: We don't know if camera exists here and getService might block for 5 seconds.
+    // Use checkService for camera if we don't know it exists.
+    static std::atomic<bool> sCameraChecked(false);  // once true never becomes false.
+    static std::atomic<bool> sCameraVerified(false); // once true never becomes false.
+    sp<IBinder> binder = (sCameraVerified || !sCameraChecked)
+        ? sm->getService(String16("media.camera")) : sm->checkService(String16("media.camera"));
     // If the device does not have a camera, do not create a death listener for it.
     if (binder != NULL) {
+        sCameraVerified = true;
         mCameraDeathListener = new ServiceDeathNotifier(binder, listener,
                 MediaPlayerService::CAMERA_PROCESS_DEATH);
         binder->linkToDeath(mCameraDeathListener);
     }
+    sCameraChecked = true;
 
     binder = sm->getService(String16("media.codec"));
     mCodecDeathListener = new ServiceDeathNotifier(binder, listener,