Advertisement
Guest User

Untitled

a guest
Oct 25th, 2018
913
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.82 KB | None | 0 0
  1. import android.app.Service;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.graphics.PixelFormat;
  5. import android.hardware.camera2.*;
  6. import android.hardware.Camera;
  7. import android.hardware.camera2.CameraManager;
  8. import android.media.CamcorderProfile;
  9. import android.media.MediaRecorder;
  10. import android.os.Bundle;
  11. import android.os.IBinder;
  12. import android.os.ResultReceiver;
  13. import android.util.Log;
  14. import android.view.SurfaceHolder;
  15. import android.view.SurfaceView;
  16. import android.view.WindowManager;
  17.  
  18. import java.io.File;
  19. import java.io.FileNotFoundException;
  20. import java.io.FileOutputStream;
  21. import java.io.IOException;
  22. import java.util.List;
  23.  
  24. public class CameraService extends Service {
  25. private static final String TAG = CameraService.class.getSimpleName();
  26.  
  27. public static final String RESULT_RECEIVER = "resultReceiver";
  28. public static final String VIDEO_PATH = "recordedVideoPath";
  29.  
  30. public static final int RECORD_RESULT_OK = 0;
  31. public static final int RECORD_RESULT_DEVICE_NO_CAMERA= 1;
  32. public static final int RECORD_RESULT_GET_CAMERA_FAILED = 2;
  33. public static final int RECORD_RESULT_ALREADY_RECORDING = 3;
  34. public static final int RECORD_RESULT_NOT_RECORDING = 4;
  35. public static final int RECORD_RESULT_UNSTOPPABLE = 5;
  36.  
  37. private static final String START_SERVICE_COMMAND = "startServiceCommands";
  38. private static final int COMMAND_NONE = -1;
  39. private static final int COMMAND_START_RECORDING = 0;
  40. private static final int COMMAND_STOP_RECORDING = 1;
  41.  
  42. private static final String SELECTED_CAMERA_FOR_RECORDING = "cameraForRecording";
  43.  
  44. private Camera mCamera;
  45. private MediaRecorder mMediaRecorder;
  46.  
  47. private boolean mRecording = false;
  48. private String mRecordingPath = null;
  49.  
  50. public CameraService() {
  51. }
  52.  
  53. public static void startToStartRecording(Context context, int cameraId,
  54. ResultReceiver resultReceiver) {
  55. Intent intent = new Intent(context, CameraService.class);
  56. intent.putExtra(START_SERVICE_COMMAND, COMMAND_START_RECORDING);
  57. intent.putExtra(SELECTED_CAMERA_FOR_RECORDING, cameraId);
  58. intent.putExtra(RESULT_RECEIVER, resultReceiver);
  59. context.startService(intent);
  60. }
  61.  
  62. public static void startToStopRecording(Context context, ResultReceiver resultReceiver) {
  63. Intent intent = new Intent(context, CameraService.class);
  64. intent.putExtra(START_SERVICE_COMMAND, COMMAND_STOP_RECORDING);
  65. intent.putExtra(RESULT_RECEIVER, resultReceiver);
  66. context.startService(intent);
  67. }
  68.  
  69. /**
  70. * Used to take picture.
  71. */
  72. private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
  73. @Override
  74. public void onPictureTaken(byte[] data, Camera camera) {
  75. File pictureFile = Util.getOutputMediaFile(Util.MEDIA_TYPE_IMAGE);
  76.  
  77. if (pictureFile == null) {
  78. return;
  79. }
  80.  
  81. try {
  82. FileOutputStream fos = new FileOutputStream(pictureFile);
  83. fos.write(data);
  84. fos.close();
  85. } catch (FileNotFoundException e) {
  86. } catch (IOException e) {
  87. }
  88. }
  89. };
  90.  
  91. @Override
  92. public int onStartCommand(Intent intent, int flags, int startId) {
  93. if (intent == null) {
  94. throw new IllegalStateException("Must start the service with intent");
  95. }
  96. switch (intent.getIntExtra(START_SERVICE_COMMAND, COMMAND_NONE)) {
  97. case COMMAND_START_RECORDING:
  98. handleStartRecordingCommand(intent);
  99. break;
  100. case COMMAND_STOP_RECORDING:
  101. handleStopRecordingCommand(intent);
  102. break;
  103. default:
  104. throw new UnsupportedOperationException("Cannot start service with illegal commands");
  105. }
  106.  
  107. return START_NOT_STICKY;
  108. }
  109.  
  110. private void handleStartRecordingCommand(Intent intent) {
  111. if (!Util.isCameraExist(this)) {
  112. throw new IllegalStateException("There is no device, not possible to start recording");
  113. }
  114.  
  115. final ResultReceiver resultReceiver = intent.getParcelableExtra(RESULT_RECEIVER);
  116.  
  117. if (mRecording) {
  118. // Already recording
  119. resultReceiver.send(RECORD_RESULT_ALREADY_RECORDING, null);
  120. return;
  121. }
  122. mRecording = true;
  123.  
  124. final int cameraId = intent.getIntExtra(SELECTED_CAMERA_FOR_RECORDING,
  125. Camera.CameraInfo.CAMERA_FACING_BACK);
  126. mCamera = Util.getCameraInstance(cameraId);
  127. if (mCamera != null) {
  128. SurfaceView sv = new SurfaceView(this);
  129.  
  130. WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
  131. WindowManager.LayoutParams params = new WindowManager.LayoutParams(1, 1,
  132. WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
  133. WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
  134. PixelFormat.TRANSLUCENT);
  135.  
  136. SurfaceHolder sh = sv.getHolder();
  137.  
  138. sv.setZOrderOnTop(true);
  139. sh.setFormat(PixelFormat.TRANSPARENT);
  140.  
  141. sh.addCallback(new SurfaceHolder.Callback() {
  142. @Override
  143. public void surfaceCreated(SurfaceHolder holder) {
  144. Camera.Parameters params = mCamera.getParameters();
  145. mCamera.setParameters(params);
  146. Camera.Parameters p = mCamera.getParameters();
  147.  
  148. List<Camera.Size> listSize;
  149.  
  150. listSize = p.getSupportedPreviewSizes();
  151. Camera.Size mPreviewSize = listSize.get(2);
  152. Log.v(TAG, "preview width = " + mPreviewSize.width
  153. + " preview height = " + mPreviewSize.height);
  154. p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
  155.  
  156. listSize = p.getSupportedPictureSizes();
  157. Camera.Size mPictureSize = listSize.get(2);
  158. Log.v(TAG, "capture width = " + mPictureSize.width
  159. + " capture height = " + mPictureSize.height);
  160. p.setPictureSize(mPictureSize.width, mPictureSize.height);
  161. mCamera.setParameters(p);
  162.  
  163. try {
  164. mCamera.setPreviewDisplay(holder);
  165. } catch (IOException e) {
  166. e.printStackTrace();
  167. }
  168. mCamera.startPreview();
  169.  
  170. mCamera.unlock();
  171.  
  172. mMediaRecorder = new MediaRecorder();
  173. mMediaRecorder.setCamera(mCamera);
  174.  
  175. mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  176. mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  177.  
  178. if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
  179. mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
  180. } else {
  181.  
  182. mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_480P));
  183. }
  184.  
  185. mRecordingPath =
  186. Util.getOutputMediaFile(Util.MEDIA_TYPE_VIDEO).getPath();
  187. mMediaRecorder.setOutputFile(mRecordingPath);
  188.  
  189. mMediaRecorder.setPreviewDisplay(holder.getSurface());
  190.  
  191. try {
  192. mMediaRecorder.prepare();
  193. } catch (IllegalStateException e) {
  194. Log.d(TAG, "IllegalStateException when preparing
  195. MediaRecorder: " + e.getMessage());
  196. } catch (IOException e) {
  197. Log.d(TAG, "IOException when preparing MediaRecorder: "
  198. + e.getMessage());
  199. }
  200. mMediaRecorder.start();
  201.  
  202. resultReceiver.send(RECORD_RESULT_OK, null);
  203. Log.d(TAG, "Recording is started");
  204. }
  205.  
  206. @Override
  207. public void surfaceChanged(SurfaceHolder holder, int format, int
  208. width, int height) {
  209. }
  210.  
  211. @Override
  212. public void surfaceDestroyed(SurfaceHolder holder) {
  213. }
  214. });
  215.  
  216.  
  217. wm.addView(sv, params);
  218.  
  219. } else {
  220. Log.d(TAG, "Get Camera from service failed");
  221. resultReceiver.send(RECORD_RESULT_GET_CAMERA_FAILED, null);
  222. }
  223. }
  224.  
  225. private void handleStopRecordingCommand(Intent intent) {
  226. ResultReceiver resultReceiver = intent.getParcelableExtra(RESULT_RECEIVER);
  227.  
  228. if (!mRecording) {
  229. // have not recorded
  230. resultReceiver.send(RECORD_RESULT_NOT_RECORDING, null);
  231. return;
  232. }
  233.  
  234. try {
  235. mMediaRecorder.stop();
  236. mMediaRecorder.release();
  237. } catch (RuntimeException e) {
  238. mMediaRecorder.reset();
  239. resultReceiver.send(RECORD_RESULT_UNSTOPPABLE, new Bundle());
  240. return;
  241. } finally {
  242. mMediaRecorder = null;
  243. mCamera.stopPreview();
  244. mCamera.release();
  245.  
  246. mRecording = false;
  247. }
  248.  
  249. Bundle b = new Bundle();
  250. b.putString(VIDEO_PATH, mRecordingPath);
  251. resultReceiver.send(RECORD_RESULT_OK, b);
  252.  
  253. Log.d(TAG, "recording is finished.");
  254. }
  255.  
  256. @Override
  257. public IBinder onBind(Intent intent) {
  258. // TODO: Return the communication channel to the service.
  259. throw new UnsupportedOperationException("Not yet implemented");
  260. }
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement