@@ -31,6 +31,9 @@ public class CameraService extends Service {
               | 
            ||
| 31 | 31 | 
                public static final int MSG_CAMERA_CONN_ERROR = 8001;  | 
            
| 32 | 32 | 
                public static final int MSG_CAMERA_NEW_PHOTO_FOUND = 8002;  | 
            
| 33 | 33 | 
                 | 
            
| 34 | 
                +  | 
            |
| 35 | 
                + public static final String EXTRA_CMD = "cmd";  | 
            |
| 36 | 
                + public static final String EXTRA_SESSION_DIR = "session_dir";  | 
            |
| 34 | 37 | 
                public static final int CMD_INIT_CAMERA_CONNECTION = 9000;  | 
            
| 35 | 38 | 
                public static final int CMD_EXIT_CAMERA_CONNECTION = 9001;  | 
            
| 36 | 39 | 
                public static final int CMD_START_CAPTURE_PHOTO = 9002;  | 
            
                @@ -51,8 +54,8 @@ public class CameraService extends Service {
               | 
            ||
| 51 | 54 | 
                 | 
            
| 52 | 55 | 
                @Override  | 
            
| 53 | 56 | 
                     public int onStartCommand(Intent intent, int flags, int startId) {
               | 
            
| 54 | 
                -        if(intent!=null&&intent.getIntExtra("cmd",0)>0){
               | 
            |
| 55 | 
                -            int cmd = intent.getIntExtra("cmd",0);
               | 
            |
| 57 | 
                +        if(intent!=null&&intent.getIntExtra(EXTRA_CMD,0)>0){
               | 
            |
| 58 | 
                + int cmd = intent.getIntExtra(EXTRA_CMD,0);  | 
            |
| 56 | 59 | 
                             if(cmd == CMD_EXIT_CAMERA_CONNECTION){
               | 
            
| 57 | 60 | 
                stopCameraService();  | 
            
| 58 | 61 | 
                return START_NOT_STICKY;  | 
            
                @@ -63,7 +66,7 @@ public class CameraService extends Service {
               | 
            ||
| 63 | 66 | 
                }  | 
            
| 64 | 67 | 
                             }else if(cmd == CMD_START_CAPTURE_PHOTO){
               | 
            
| 65 | 68 | 
                                 if(isInitExecuted){
               | 
            
| 66 | 
                -                    sessionWorkingDirPath = intent.getStringExtra("session_dir");
               | 
            |
| 69 | 
                + sessionWorkingDirPath = intent.getStringExtra(EXTRA_SESSION_DIR);  | 
            |
| 67 | 70 | 
                                     if(!TextUtils.isEmpty(sessionWorkingDirPath)){
               | 
            
| 68 | 71 | 
                startCapture();  | 
            
| 69 | 72 | 
                }  | 
            
                @@ -1,37 +1,42 @@  | 
            ||
| 1 | 1 | 
                package ai.pai.lensman.session;  | 
            
| 2 | 2 | 
                 | 
            
| 3 | 
                +import android.content.BroadcastReceiver;  | 
            |
| 4 | 
                +import android.content.Context;  | 
            |
| 5 | 
                +import android.content.Intent;  | 
            |
| 6 | 
                +import android.content.IntentFilter;  | 
            |
| 3 | 7 | 
                import android.os.Handler;  | 
            
| 4 | 8 | 
                import android.os.Handler.Callback;  | 
            
| 5 | 9 | 
                import android.os.Message;  | 
            
| 6 | 
                -import android.text.TextUtils;  | 
            |
| 7 | 10 | 
                 | 
            
| 8 | 11 | 
                import com.android.common.utils.LogHelper;  | 
            
| 9 | 12 | 
                 | 
            
| 10 | 13 | 
                import java.io.File;  | 
            
| 11 | 
                -import java.util.Timer;  | 
            |
| 12 | 
                -import java.util.TimerTask;  | 
            |
| 13 | 14 | 
                 | 
            
| 15 | 
                +import ai.pai.lensman.App;  | 
            |
| 14 | 16 | 
                import ai.pai.lensman.bean.PhotoBean;  | 
            
| 15 | 17 | 
                import ai.pai.lensman.bean.SessionBean;  | 
            
| 16 | 
                -import ai.pai.lensman.dslr.CameraJNIInterface;  | 
            |
| 18 | 
                +import ai.pai.lensman.dslr.CameraService;  | 
            |
| 17 | 19 | 
                import ai.pai.lensman.service.Constants;  | 
            
| 18 | 20 | 
                 | 
            
| 21 | 
                +import static ai.pai.lensman.dslr.CameraService.ACTION_CAMERA_SERVICE_STATUS_CHANGE;  | 
            |
| 22 | 
                +import static ai.pai.lensman.dslr.CameraService.CMD_EXIT_CAMERA_CONNECTION;  | 
            |
| 23 | 
                +import static ai.pai.lensman.dslr.CameraService.CMD_INIT_CAMERA_CONNECTION;  | 
            |
| 24 | 
                +import static ai.pai.lensman.dslr.CameraService.CMD_START_CAPTURE_PHOTO;  | 
            |
| 25 | 
                +import static ai.pai.lensman.dslr.CameraService.EXTRA_CMD;  | 
            |
| 26 | 
                +import static ai.pai.lensman.dslr.CameraService.EXTRA_DATA_PART;  | 
            |
| 27 | 
                +import static ai.pai.lensman.dslr.CameraService.EXTRA_STATUS_PART;  | 
            |
| 28 | 
                +import static ai.pai.lensman.dslr.CameraService.MSG_CAMERA_CONN_ERROR;  | 
            |
| 29 | 
                +import static ai.pai.lensman.dslr.CameraService.MSG_CAMERA_INIT_SUCCESS;  | 
            |
| 30 | 
                +import static ai.pai.lensman.dslr.CameraService.MSG_CAMERA_NEW_PHOTO_FOUND;  | 
            |
| 31 | 
                +  | 
            |
| 19 | 32 | 
                 public class SessionInteractor implements Callback{
               | 
            
| 20 | 33 | 
                 | 
            
| 21 | 
                - private Timer photoCaptureTimer;  | 
            |
| 34 | 
                + private Handler mHandler;  | 
            |
| 22 | 35 | 
                private SessionBean sessionBean;  | 
            
| 23 | 36 | 
                private SessionListener listener;  | 
            
| 24 | 37 | 
                private String sessionWorkingDirPath;  | 
            
| 25 | 38 | 
                 | 
            
| 26 | 
                - private boolean isWorking;  | 
            |
| 27 | 
                - private boolean isLastQueryReturned = true;  | 
            |
| 28 | 
                -  | 
            |
| 29 | 
                - private Handler cameraInitHandler;  | 
            |
| 30 | 
                - private static final int MSG_CAMERA_INIT_EVENT = 1001;  | 
            |
| 31 | 
                -  | 
            |
| 32 | 
                - private static final String MSG_TYPE_CAMERA_ERROR = "camero error";//相机错误,可能是线松动了。先exit,然后重新init  | 
            |
| 33 | 
                - private static final String MSG_TYPE_NOT_INIT = "not init"; //需要初始化  | 
            |
| 34 | 
                - private static final String MSG_TYPE_TIME_OUT = "time out"; //继续调用waitforevent  | 
            |
| 39 | 
                + private static final int MSG_RETRY_INIT_CAMERA = 1001;  | 
            |
| 35 | 40 | 
                 | 
            
| 36 | 41 | 
                private static final String TAG = "SessionInteractor";  | 
            
| 37 | 42 | 
                 | 
            
                @@ -42,16 +47,10 @@ public class SessionInteractor implements Callback{
               | 
            ||
| 42 | 47 | 
                 | 
            
| 43 | 48 | 
                @Override  | 
            
| 44 | 49 | 
                     public boolean handleMessage(Message message) {
               | 
            
| 45 | 
                -        if(message.what==MSG_CAMERA_INIT_EVENT){
               | 
            |
| 46 | 
                - int result = CameraJNIInterface.getInstance().java_mygpcamerainit();  | 
            |
| 47 | 
                -            listener.onCameraStatusChanged("mygpcamerainit return "+result);
               | 
            |
| 48 | 
                -            if(result>=0){
               | 
            |
| 49 | 
                - listener.onSessionStartSuccess(sessionBean.sessionId);  | 
            |
| 50 | 
                - isWorking = true;  | 
            |
| 51 | 
                - startCapture();  | 
            |
| 52 | 
                -            }else{
               | 
            |
| 53 | 
                - cameraInitHandler.sendEmptyMessageDelayed(MSG_CAMERA_INIT_EVENT,1000);  | 
            |
| 54 | 
                - }  | 
            |
| 50 | 
                +        if(message.what == MSG_RETRY_INIT_CAMERA){
               | 
            |
| 51 | 
                + Intent intent = new Intent(App.getAppContext(), CameraService.class);  | 
            |
| 52 | 
                + intent.putExtra(EXTRA_CMD,CMD_INIT_CAMERA_CONNECTION);  | 
            |
| 53 | 
                + App.getAppContext().startService(intent);  | 
            |
| 55 | 54 | 
                }  | 
            
| 56 | 55 | 
                return false;  | 
            
| 57 | 56 | 
                }  | 
            
                @@ -66,105 +65,36 @@ public class SessionInteractor implements Callback{
               | 
            ||
| 66 | 65 | 
                 | 
            
| 67 | 66 | 
                     public void startSession(){
               | 
            
| 68 | 67 | 
                LogHelper.d(TAG,"startSession");  | 
            
| 68 | 
                + mHandler = new Handler(this);  | 
            |
| 69 | 69 | 
                sessionWorkingDirPath = Constants.APP_IMAGE_DIR + File.separator + sessionBean.sessionId  | 
            
| 70 | 70 | 
                + File.separator + ai.pai.lensman.utils.Constants.ORIGIN_DIR_NAME;  | 
            
| 71 | 71 | 
                new File(sessionWorkingDirPath).mkdirs();  | 
            
| 72 | 
                -  | 
            |
| 73 | 
                - int result = CameraJNIInterface.getInstance().java_mygpcamerainit();  | 
            |
| 74 | 
                -        listener.onCameraStatusChanged("mygpcamerainit return "+result);
               | 
            |
| 75 | 
                -        if(result>=0){
               | 
            |
| 76 | 
                -            LogHelper.d("czy","mygpcamerainit init success="+result);
               | 
            |
| 77 | 
                - listener.onSessionStartSuccess(sessionBean.sessionId);  | 
            |
| 78 | 
                - isWorking = true;  | 
            |
| 79 | 
                - startCapture();  | 
            |
| 80 | 
                -        }else{
               | 
            |
| 81 | 
                -            LogHelper.d("czy","mygpcamerainit init fail ="+result+" and schedule retry");
               | 
            |
| 82 | 
                -            if(cameraInitHandler!=null){
               | 
            |
| 83 | 
                - cameraInitHandler.removeCallbacksAndMessages(null);  | 
            |
| 84 | 
                - cameraInitHandler = null;  | 
            |
| 85 | 
                - }  | 
            |
| 86 | 
                - cameraInitHandler = new Handler(this);  | 
            |
| 87 | 
                - cameraInitHandler.sendEmptyMessageDelayed(MSG_CAMERA_INIT_EVENT,1000);  | 
            |
| 88 | 
                - listener.onSessionStartError(sessionBean.sessionId);  | 
            |
| 89 | 
                - }  | 
            |
| 90 | 
                -  | 
            |
| 72 | 
                + IntentFilter intentFilter = new IntentFilter(ACTION_CAMERA_SERVICE_STATUS_CHANGE);  | 
            |
| 73 | 
                + App.getAppContext().registerReceiver(cameraReceiver,intentFilter);  | 
            |
| 74 | 
                + Intent intent = new Intent(App.getAppContext(), CameraService.class);  | 
            |
| 75 | 
                + intent.putExtra(EXTRA_CMD,CMD_INIT_CAMERA_CONNECTION);  | 
            |
| 76 | 
                + App.getAppContext().startService(intent);  | 
            |
| 91 | 77 | 
                }  | 
            
| 92 | 78 | 
                 | 
            
| 93 | 79 | 
                     public void startCapture() {
               | 
            
| 94 | 
                -        if(photoCaptureTimer !=null){
               | 
            |
| 95 | 
                - photoCaptureTimer.cancel();  | 
            |
| 96 | 
                - photoCaptureTimer = null;  | 
            |
| 97 | 
                - }  | 
            |
| 98 | 
                - photoCaptureTimer = new Timer();  | 
            |
| 99 | 
                -        photoCaptureTimer.schedule(new TimerTask() {
               | 
            |
| 100 | 
                - @Override  | 
            |
| 101 | 
                -            public void run() {
               | 
            |
| 102 | 
                - fetchPhotoTask();  | 
            |
| 103 | 
                - }  | 
            |
| 104 | 
                - },1000,10);  | 
            |
| 105 | 
                -        LogHelper.d("czy","startCapture ,schedule fetchPhotoTask ");
               | 
            |
| 106 | 
                - }  | 
            |
| 107 | 
                -  | 
            |
| 108 | 
                -    private void fetchPhotoTask(){
               | 
            |
| 109 | 
                -        if(!isWorking){
               | 
            |
| 110 | 
                - return;  | 
            |
| 111 | 
                - }  | 
            |
| 80 | 
                + Intent intent = new Intent(App.getAppContext(), CameraService.class);  | 
            |
| 81 | 
                + intent.putExtra(EXTRA_CMD,CMD_START_CAPTURE_PHOTO);  | 
            |
| 82 | 
                + App.getAppContext().startService(intent);  | 
            |
| 112 | 83 | 
                 | 
            
| 113 | 
                -        if(!isLastQueryReturned){
               | 
            |
| 114 | 
                -            LogHelper.d("czy","fetchPhotoTask last query not finished,return ");
               | 
            |
| 115 | 
                - return;  | 
            |
| 116 | 
                - }  | 
            |
| 117 | 
                -  | 
            |
| 118 | 
                - isLastQueryReturned = false;  | 
            |
| 119 | 
                - String eventMsg = CameraJNIInterface.getInstance().java_mygpcamerawaitforevent(sessionWorkingDirPath);  | 
            |
| 120 | 
                -        listener.onCameraStatusChanged("mygpcamerawaitforevent return "+eventMsg);
               | 
            |
| 121 | 
                -        LogHelper.d("czy","mygpcamerawaitforevent return result = "+eventMsg);
               | 
            |
| 122 | 
                -        if(eventMsg!=null && eventMsg.length()>0){
               | 
            |
| 123 | 
                -            if(MSG_TYPE_NOT_INIT.equalsIgnoreCase(eventMsg)||MSG_TYPE_CAMERA_ERROR.equalsIgnoreCase(eventMsg)){
               | 
            |
| 124 | 
                - endSession();  | 
            |
| 125 | 
                - startSession();  | 
            |
| 126 | 
                -            }else if(MSG_TYPE_TIME_OUT.equalsIgnoreCase(eventMsg)){
               | 
            |
| 127 | 
                -  | 
            |
| 128 | 
                -            }else{
               | 
            |
| 129 | 
                - String sub = eventMsg.substring(0,1);  | 
            |
| 130 | 
                -                if(TextUtils.isDigitsOnly(sub)){
               | 
            |
| 131 | 
                - LogHelper.d(TAG,"fetchPhotoTask new photo found");  | 
            |
| 132 | 
                - PhotoBean bean = new PhotoBean();  | 
            |
| 133 | 
                - bean.photoName = eventMsg;  | 
            |
| 134 | 
                -                    bean.photoId = Long.parseLong(eventMsg.substring(0,eventMsg.lastIndexOf(".")));
               | 
            |
| 135 | 
                - bean.captureTime = bean.photoId;  | 
            |
| 136 | 
                - bean.isRawPhoto = true;  | 
            |
| 137 | 
                - bean.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;  | 
            |
| 138 | 
                - bean.sessionId = sessionBean.sessionId;  | 
            |
| 139 | 
                - bean.lensmanId = sessionBean.lensmanId;  | 
            |
| 140 | 
                - bean.sessionSeq = sessionBean.sessionSeq;  | 
            |
| 141 | 
                - bean.sessionDate = sessionBean.sessionDate;  | 
            |
| 142 | 
                - bean.sessionCreateTime = sessionBean.createTime;  | 
            |
| 143 | 
                - bean.photoPath = sessionWorkingDirPath+File.separator+eventMsg;  | 
            |
| 144 | 
                - listener.onSessionPhotoCaptured(bean);  | 
            |
| 145 | 
                - }  | 
            |
| 146 | 
                - }  | 
            |
| 147 | 
                - }  | 
            |
| 148 | 
                -  | 
            |
| 149 | 
                - isLastQueryReturned = true;  | 
            |
| 150 | 84 | 
                }  | 
            
| 151 | 85 | 
                 | 
            
| 152 | 86 | 
                 | 
            
| 153 | 
                -  | 
            |
| 154 | 87 | 
                     public void endSession(){
               | 
            
| 155 | 
                - isWorking = false;  | 
            |
| 156 | 
                -        if(photoCaptureTimer !=null){
               | 
            |
| 157 | 
                - photoCaptureTimer.cancel();  | 
            |
| 158 | 
                - photoCaptureTimer = null;  | 
            |
| 159 | 
                - }  | 
            |
| 160 | 
                - int result = CameraJNIInterface.getInstance().java_mygpcameraexit();  | 
            |
| 161 | 
                -        listener.onCameraStatusChanged("mygpcameraexit return "+result);
               | 
            |
| 162 | 
                - listener.onSessionEnd(sessionBean.sessionId);  | 
            |
| 163 | 
                -        if(cameraInitHandler!=null){
               | 
            |
| 164 | 
                - cameraInitHandler.removeCallbacksAndMessages(null);  | 
            |
| 165 | 
                - cameraInitHandler = null;  | 
            |
| 88 | 
                +        if(mHandler!=null){
               | 
            |
| 89 | 
                + mHandler.removeCallbacksAndMessages(null);  | 
            |
| 90 | 
                + mHandler = null;  | 
            |
| 166 | 91 | 
                }  | 
            
| 92 | 
                + Intent intent = new Intent(App.getAppContext(), CameraService.class);  | 
            |
| 93 | 
                + intent.putExtra(EXTRA_CMD,CMD_EXIT_CAMERA_CONNECTION);  | 
            |
| 94 | 
                + App.getAppContext().startService(intent);  | 
            |
| 95 | 
                + App.getAppContext().unregisterReceiver(cameraReceiver);  | 
            |
| 167 | 96 | 
                         LogHelper.d("czy","endSession ");
               | 
            
| 97 | 
                + listener.onSessionEnd(sessionBean.sessionId);  | 
            |
| 168 | 98 | 
                }  | 
            
| 169 | 99 | 
                 | 
            
| 170 | 100 | 
                     public void deletePhoto(PhotoBean photoBean){
               | 
            
                @@ -172,4 +102,41 @@ public class SessionInteractor implements Callback{
               | 
            ||
| 172 | 102 | 
                new File(photoBean.photoPath).delete();  | 
            
| 173 | 103 | 
                }  | 
            
| 174 | 104 | 
                 | 
            
| 105 | 
                +    private BroadcastReceiver cameraReceiver = new BroadcastReceiver() {
               | 
            |
| 106 | 
                + @Override  | 
            |
| 107 | 
                +        public void onReceive(Context context, Intent intent) {
               | 
            |
| 108 | 
                +            if(!ACTION_CAMERA_SERVICE_STATUS_CHANGE.equals(intent.getAction())){
               | 
            |
| 109 | 
                + return;  | 
            |
| 110 | 
                + }  | 
            |
| 111 | 
                + int status = intent.getIntExtra(EXTRA_STATUS_PART,0);  | 
            |
| 112 | 
                +            if(status==MSG_CAMERA_INIT_SUCCESS){
               | 
            |
| 113 | 
                + listener.onSessionStartSuccess(sessionBean.sessionId);  | 
            |
| 114 | 
                +                listener.onCameraStatusChanged("camera init success");
               | 
            |
| 115 | 
                + startCapture();  | 
            |
| 116 | 
                +            }else if(status == MSG_CAMERA_CONN_ERROR){
               | 
            |
| 117 | 
                +                listener.onCameraStatusChanged("camera connection error");
               | 
            |
| 118 | 
                + listener.onSessionStartError(sessionBean.sessionId);  | 
            |
| 119 | 
                + mHandler.sendEmptyMessageDelayed(MSG_RETRY_INIT_CAMERA,3000);  | 
            |
| 120 | 
                +            }else if(status == MSG_CAMERA_NEW_PHOTO_FOUND){
               | 
            |
| 121 | 
                + String eventMsg = intent.getStringExtra(EXTRA_DATA_PART);  | 
            |
| 122 | 
                + LogHelper.d(TAG,"fetchPhotoTask new photo found");  | 
            |
| 123 | 
                +                listener.onCameraStatusChanged("camera new Photo found "+eventMsg);
               | 
            |
| 124 | 
                + PhotoBean bean = new PhotoBean();  | 
            |
| 125 | 
                + bean.photoName = eventMsg;  | 
            |
| 126 | 
                +                bean.photoId = Long.parseLong(eventMsg.substring(0,eventMsg.lastIndexOf(".")));
               | 
            |
| 127 | 
                + bean.captureTime = bean.photoId;  | 
            |
| 128 | 
                + bean.isRawPhoto = true;  | 
            |
| 129 | 
                + bean.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;  | 
            |
| 130 | 
                + bean.sessionId = sessionBean.sessionId;  | 
            |
| 131 | 
                + bean.lensmanId = sessionBean.lensmanId;  | 
            |
| 132 | 
                + bean.sessionSeq = sessionBean.sessionSeq;  | 
            |
| 133 | 
                + bean.sessionDate = sessionBean.sessionDate;  | 
            |
| 134 | 
                + bean.sessionCreateTime = sessionBean.createTime;  | 
            |
| 135 | 
                + bean.photoPath = sessionWorkingDirPath+File.separator+eventMsg;  | 
            |
| 136 | 
                + listener.onSessionPhotoCaptured(bean);  | 
            |
| 137 | 
                + }  | 
            |
| 138 | 
                +  | 
            |
| 139 | 
                + }  | 
            |
| 140 | 
                + };  | 
            |
| 141 | 
                +  | 
            |
| 175 | 142 | 
                }  |