Commit f6f2d0a4 by maiqh

修改不能重复打开camera的bug

parent 1038e1ed
...@@ -16,7 +16,6 @@ import com.autonavi.amapauto.gdarcameraservice.IGDCameraStateCallBack; ...@@ -16,7 +16,6 @@ import com.autonavi.amapauto.gdarcameraservice.IGDCameraStateCallBack;
import com.autonavi.amapauto.gdarcameraservice.IGDSize; import com.autonavi.amapauto.gdarcameraservice.IGDSize;
import com.autonavi.amapauto.gdarcameraservice.model.ArCameraOpenResultParam; import com.autonavi.amapauto.gdarcameraservice.model.ArCameraOpenResultParam;
import com.autonavi.amapauto.gdarcameraservice.model.GDArCameraParam; import com.autonavi.amapauto.gdarcameraservice.model.GDArCameraParam;
import com.autonavi.amapauto.gdarcameraservicedemo.utils.LogUtils;
import com.autonavi.amapauto.gdarcameraservicedemo.utils.SharedMemUtils; import com.autonavi.amapauto.gdarcameraservicedemo.utils.SharedMemUtils;
import java.io.FileDescriptor; import java.io.FileDescriptor;
...@@ -56,11 +55,6 @@ public class GDArCameraService extends Service { ...@@ -56,11 +55,6 @@ public class GDArCameraService extends Service {
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
try {
mMemoryFile = new MemoryFile(MEMORY_NAME, MEMORY_SIZE);
} catch (IOException e) {
e.printStackTrace();
}
return binder; return binder;
} }
...@@ -110,18 +104,28 @@ public class GDArCameraService extends Service { ...@@ -110,18 +104,28 @@ public class GDArCameraService extends Service {
public boolean initCamera(String clientId, GDArCameraParam gdArCameraParam, Surface surface) throws RemoteException { public boolean initCamera(String clientId, GDArCameraParam gdArCameraParam, Surface surface) throws RemoteException {
mCamera = null; mCamera = null;
mSurface = surface; mSurface = surface;
try {
mCamera = Camera.open(); // attempt to get a Camera instance
} catch (Exception e) {
// Camera is not available (in use or does not exist)
return false;
}
mISCameraConnect = true; mISCameraConnect = true;
return true; return true;
} }
@Override @Override
public boolean openCamera(String clientId) throws RemoteException { public boolean openCamera(String clientId) throws RemoteException {
if (mMemoryFile == null) {
try {
mMemoryFile = new MemoryFile(MEMORY_NAME, MEMORY_SIZE);
} catch (IOException e) {
e.printStackTrace();
}
}
if (mCamera == null) {
try {
mCamera = Camera.open(); // attempt to get a Camera instance
} catch (Exception e) {
// Camera is not available (in use or does not exist)
return false;
}
}
if (mCamera == null) { if (mCamera == null) {
mIsCameraOpened = false; mIsCameraOpened = false;
...@@ -155,17 +159,24 @@ public class GDArCameraService extends Service { ...@@ -155,17 +159,24 @@ public class GDArCameraService extends Service {
mCamera.setPreviewCallback(new Camera.PreviewCallback() { mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override @Override
public void onPreviewFrame(byte[] data, Camera camera) { public void onPreviewFrame(byte[] data, Camera camera) {
if (!mISCameraConnect) {
// 防止关闭摄像头后,还有回调,导致下一次打开屏幕发绿
return;
}
try { try {
// 这里有个异步导致下一次打开屏幕发绿的问题,目前简单通过mISCameraConnect暂时解决,到时正式接入时要考虑这个问题
sendData(data, camera); sendData(data, camera);
} catch (IOException e) { if (!mIsCameraOpened && mISCameraConnect) {
initMemoryFile();
mIsCameraOpened = true;
}
} catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
}); });
mCamera.startPreview(); mCamera.startPreview();
mPreviewSize = mCamera.getParameters().getPreviewSize();//获取尺寸,格式转换的时候要用到 mPreviewSize = mCamera.getParameters().getPreviewSize();//获取尺寸,格式转换的时候要用到
initMemoryFile();
mIsCameraOpened = true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e(TAG, "Error starting camera preview: " + e.getMessage()); Log.e(TAG, "Error starting camera preview: " + e.getMessage());
...@@ -177,12 +188,19 @@ public class GDArCameraService extends Service { ...@@ -177,12 +188,19 @@ public class GDArCameraService extends Service {
@Override @Override
public boolean closeCamera(String clientId) throws RemoteException { public boolean closeCamera(String clientId) throws RemoteException {
if (mMemoryFile != null) {
mMemoryFile.close();
mMemoryFile = null;
}
if (mCamera != null) { if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null); mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
} }
mIsCameraOpened = false; mIsCameraOpened = false;
mISCameraConnect = false; mISCameraConnect = false;
isFirstSend = true;
return true; return true;
} }
...@@ -190,7 +208,7 @@ public class GDArCameraService extends Service { ...@@ -190,7 +208,7 @@ public class GDArCameraService extends Service {
public boolean unInitCamera(String clientId) throws RemoteException { public boolean unInitCamera(String clientId) throws RemoteException {
mISCameraConnect = false; mISCameraConnect = false;
mIsCameraOpened = false; mIsCameraOpened = false;
mCamera.release();
return true; return true;
} }
...@@ -198,7 +216,7 @@ public class GDArCameraService extends Service { ...@@ -198,7 +216,7 @@ public class GDArCameraService extends Service {
private byte[] header = new byte[SharedMemUtils.HEADER_SIZE]; private byte[] header = new byte[SharedMemUtils.HEADER_SIZE];
private void sendData(byte[] bytes, Camera camera) throws IOException { private synchronized void sendData(byte[] bytes, Camera camera) throws IOException {
byte[] buffer = new byte[HEADER_SIZE + bytes.length]; byte[] buffer = new byte[HEADER_SIZE + bytes.length];
...@@ -214,7 +232,7 @@ public class GDArCameraService extends Service { ...@@ -214,7 +232,7 @@ public class GDArCameraService extends Service {
} }
/** 判断共享内存是否可写 */ /** 判断共享内存是否可写 */
if (canWrite) { if (canWrite && mISCameraConnect) {
SharedMemUtils.setOffset(buffer, 0); SharedMemUtils.setOffset(buffer, 0);
SharedMemUtils.setLength(buffer, 0); SharedMemUtils.setLength(buffer, 0);
SharedMemUtils.setContentSize(buffer, bytes.length); SharedMemUtils.setContentSize(buffer, bytes.length);
...@@ -222,7 +240,9 @@ public class GDArCameraService extends Service { ...@@ -222,7 +240,9 @@ public class GDArCameraService extends Service {
try { try {
SharedMemUtils.setCanRead(buffer); SharedMemUtils.setCanRead(buffer);
mMemoryFile.writeBytes(buffer, 0, 0, buffer.length); if (mISCameraConnect) {
mMemoryFile.writeBytes(buffer, 0, 0, buffer.length);
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.d(TAG, "sendDataError: " + e.getMessage()); Log.d(TAG, "sendDataError: " + e.getMessage());
...@@ -231,7 +251,7 @@ public class GDArCameraService extends Service { ...@@ -231,7 +251,7 @@ public class GDArCameraService extends Service {
} }
} }
private void initMemoryFile() throws Exception { private synchronized void initMemoryFile() throws Exception {
Method getFileDescriptorMethod = mMemoryFile.getClass().getDeclaredMethod("getFileDescriptor"); Method getFileDescriptorMethod = mMemoryFile.getClass().getDeclaredMethod("getFileDescriptor");
if (getFileDescriptorMethod != null) { if (getFileDescriptorMethod != null) {
FileDescriptor fileDescriptor = (FileDescriptor) getFileDescriptorMethod.invoke(mMemoryFile); FileDescriptor fileDescriptor = (FileDescriptor) getFileDescriptorMethod.invoke(mMemoryFile);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment