clean the code, and fix bug service stopped when back pressed
[rtmpclient.git] / app / src / main / java / ai / suanzi / rtmpclient / MyService.java
index cba2c42..2d49e9c 100644 (file)
@@ -21,7 +21,7 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
     private static Logger gLogger = Logger.getLogger("MyService");
     private Camera mCamera = null;
     IBinder mBinder = new LocalBinder();
-    private String rtmpUrl;
+    //private String rtmpUrl;
     private long frameCount = 0;
 
     // Preferred picture Size of the camera;
@@ -53,9 +53,27 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
     private void openCameraOriginal() {
         try {
             gLogger.error("openCameraOriginal");
-            mCamera = Camera.open(1);
+            Camera.CameraInfo info = new Camera.CameraInfo();
+            int numCameras = Camera.getNumberOfCameras();
+            int backId = -1;
+            int frontId = -1;
+            int camerId = 0;
+            gLogger.debug("Number of Cameras is " + numCameras);
+            for(int i = 0; i < numCameras; i++){
+                Camera.getCameraInfo(i, info);
+                if(info.facing == Camera.CameraInfo.CAMERA_FACING_BACK){
+                    gLogger.debug("CAMERA_FACING_BACK id is " + i);
+                    backId = i;
+                } else if(info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
+                    gLogger.debug("CAMERA_FACING_FRONT id is " + i);
+                    frontId = i;
+                }
+            }
+            if(frontId != -1) camerId = frontId;
+            else if(backId != -1) camerId = backId;
+            mCamera = Camera.open(camerId);
         } catch (Exception e) {
-            gLogger.error("camera is not available. error: " + e.getMessage());
+            gLogger.error("openCameraOriginal - camera is not available. error: " + e.getMessage());
             if(mListener != null) mListener.onCameraError("openCamera - error: " + e.getMessage());
         }
     }
@@ -85,7 +103,7 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
             try {
                 wait();
             } catch (InterruptedException e) {
-                gLogger.error("wait was interrupted");
+                gLogger.error("wait was interrupted, " + e.getMessage());
             }
         }
     }
@@ -114,7 +132,7 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
         super.onCreate();
         gLogger.error("onCreate ---> ");
         createNotification();
-        //Toast.makeText(this, "Started to Publish!", Toast.LENGTH_LONG).show();
+        Toast.makeText(this, "Started to Publish!", Toast.LENGTH_LONG).show();
         mCamera = getCameraInstance();
         if(mCamera != null){
             configCamera(mCamera);
@@ -153,18 +171,21 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
     public void  onPreviewFrame(final byte[] data, Camera camera){
         if(frameCount % (15 * 60) == 0) {
             gLogger.error("onPreviewFrame");
-            if(mListener != null) mListener.onIsPreviewing("onPreviewFrame ");
         }
-        frameCount++;
         if(FfmpegHelper.processFrame(data) != 0){
-            gLogger.error("FfmpegHelper.processFrame error, close");
+            gLogger.error("onPreviewFrame, processFrame close");
             FfmpegHelper.close();
             if(mListener != null) mListener.onEncoderError("processFrame");
+        } else {
+            if(frameCount % (15 * 60) == 0){
+                if(mListener != null) mListener.onPublishing("processFrame OK");
+            }
         }
+        frameCount++;
     }
 
     public void startPreview (SurfaceHolder holder){
-        gLogger.error("startPreview");
+        gLogger.debug("startPreview");
         try {
             mCamera.setPreviewDisplay(holder);
             mCamera.startPreview();
@@ -175,11 +196,22 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
         }
     }
 
+    public void reopenCamera() {
+        if(mCamera != null){
+            mCamera.stopPreview();
+            mCamera.release();
+        }
+        openCameraOriginal();
+    }
+
     public boolean setRtmpUrl (String url){
-        this.rtmpUrl = url;
+        //this.rtmpUrl = url;
         if(mCamera == null) return false;
         gLogger.error("setRtmpUrl - size: " +  width + "x" + height + ". url: " + url);
         int ret = FfmpegHelper.initEncoder(width, height, url);
+        if(ret != 0){
+            gLogger.error("setRtmpUrl, initEncoder error");
+        }
         return ret == 0 ? true : false;
     }
 
@@ -216,8 +248,16 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
     // Camaer.onError callback
     @Override
     public void onError(int error, Camera camera){
-        //if(error == CAMERA_ERROR_SERVER_DIED)
-        gLogger.error("onError, " + error);
+        gLogger.error("Camera.OnError, " + error);
+        switch (error) {
+            case Camera.CAMERA_ERROR_SERVER_DIED:
+                gLogger.error("CAMERA_ERROR_SERVER_DIED");
+                break;
+            case Camera.CAMERA_ERROR_UNKNOWN:
+                gLogger.error("CAMERA_ERROR_UNKNOWN");
+                break;
+        }
+
         if(mListener != null) mListener.onCameraError("OnError, " + error);
     }
 
@@ -225,7 +265,7 @@ public class MyService extends Service  implements Camera.PreviewCallback, Camer
     public interface MyServiceEventListener {
         void onCameraError(String err);
         void onEncoderError(String msg);
-        void onIsPreviewing(String msg); // notify mainActivity if preview is running well
-//        void onIsPublishing(String msg); // notify main activity if encoder is running well;
+        //void onIsPreviewing(String msg); // notify mainActivity if preview is running well
+        void onPublishing(String msg); // notify main activity if encoder is running well;
     }
 }