【问题标题】:How to use camera in android to capture image and video?如何在android中使用相机来捕捉图像和视频?
【发布时间】:2012-11-03 20:46:07
【问题描述】:

如何在 android 中使用相机,以便用户可以在同一个相机应用程序中在相机模式和录像机模式之间切换,如下图右侧中心的小滑动控件。

【问题讨论】:

  • 请将适当的问题标记为其他用户的“最佳答案”。

标签: android android-camera


【解决方案1】:

库存相机应用是开源的。为什么不只是 take a look 了解它是如何实现的?

【讨论】:

    【解决方案2】:

    我不知道它是否有效,但试试这个

    你应该有 MediaRecorder recorder; Camera camera;

    尝试使用 camera.setPreviewDisplay(holder);在视频和照片之间切换 或recorder.setPreviewDisplay(holder); 在您的surfaceCreated(SurfaceHolder holder) 中。当您切换时,您应该重新创建surfaceView。 Stock 相机应用重新创建整个活动。

    【讨论】:

      【解决方案3】:

      添加切换按钮并在其中设置一些值。让我们说 0 或 1 然后捕获图像/录制视频按钮。 当切换值为 0 时调用相机方法,当切换值为 1 时调用视频方法。

      这是相机和视频录制的代码

      Capture image

      Record Video

      在一个类中实现两个类的方法。然后调用 onSnapClick 相机和 startRecording() 视频。

      希望这会有所帮助。

      【讨论】:

      • 录制视频链接坏了。
      【解决方案4】:

      尝试像这样使用相机和视频的默认功能-

      Intent intent1    = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                          String fileName = "KeyICamImage"+System.currentTimeMillis()+".JPG";
                          String mPathImage = Environment.getExternalStorageDirectory()+ "/" + fileName;
                          file = new File(mPathImage);
                          mImageCaptureUri= Uri.fromFile( file );
      
                          try 
                          {
      
                              intent1.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,mImageCaptureUri);
                              startActivityForResult(intent1, PICK_FROM_CAMERA);
                          } 
      
                          catch (Exception e) 
                          {
                          e.printStackTrace();
                          }
                      }
                  });
      

      【讨论】:

      • 使用ACTION_IMAGE_CAPTURE,我们只能拍摄图像,不能录制视频。
      【解决方案5】:

      在 UI 中使用拖曳按钮一个用于图像和其他用于视频....

      /****  Camera / Video Demo ****************/
      public class CameraDemoActivity extends Activity {
          // Activity request codes
          private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
          private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;
          public static final int MEDIA_TYPE_IMAGE = 1;
          public static final int MEDIA_TYPE_VIDEO = 2;
      
          // directory name to store captured images and videos
          private static final String IMAGE_DIRECTORY_NAME = "Hello Camera";
      
          private Uri fileUri; // file url to store image/video
      
          private ImageView imgPreview;
          private VideoView videoPreview;
          private Button btnCapturePicture, btnRecordVideo;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              imgPreview = (ImageView) findViewById(R.id.imgPreview);
              videoPreview = (VideoView) findViewById(R.id.videoPreview);
              btnCapturePicture = (Button) findViewById(R.id.btnCapturePicture);
              btnRecordVideo = (Button) findViewById(R.id.btnRecordVideo);
      
              /*
               * Capture image button click event
               */
              btnCapturePicture.setOnClickListener(new View.OnClickListener() {
      
                  @Override
                  public void onClick(View v) {
                      // capture picture
                      captureImage();
                  }
              });
      
              /*
               * Record video button click event
               */
              btnRecordVideo.setOnClickListener(new View.OnClickListener() {
      
                  @Override
                  public void onClick(View v) {
                      // record video
                      recordVideo();
                  }
              });
      
              // Checking camera availability
              if (!isDeviceSupportCamera()) {
                  Toast.makeText(getApplicationContext(),
                          "Sorry! Your device doesn't support camera",
                          Toast.LENGTH_LONG).show();
                  // will close the app if the device does't have camera
                  finish();
              }
          }
      
          /**
           * Checking device has camera hardware or not
           * */
          private boolean isDeviceSupportCamera() {
              if (getApplicationContext().getPackageManager().hasSystemFeature(
                      PackageManager.FEATURE_CAMERA)) {
                  // this device has a camera
                  return true;
              } else {
                  // no camera on this device
                  return false;
              }
          }
      
          /*
           * Capturing Camera Image will lauch camera app requrest image capture
           */
          private void captureImage() {
              Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      
              fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
      
              intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
      
              // start the image capture Intent
              startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
          }
      
          /*
           * Here we store the file url as it will be 
           * null after returning from camera
           * app
           */
          @Override
          protected void onSaveInstanceState(Bundle outState) {
              super.onSaveInstanceState(outState);
      
              // save file url in bundle as it will be null on scren orientation
              // changes
              outState.putParcelable("file_uri", fileUri);
          }
      
          @Override
          protected void onRestoreInstanceState(Bundle savedInstanceState) {
              super.onRestoreInstanceState(savedInstanceState);
      
              // get the file url
              fileUri = savedInstanceState.getParcelable("file_uri");
          }
      
          /*
           * Recording video
           */
          private void recordVideo() {
              Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
      
              fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
      
              // set video quality
              intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
      
              intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the 
                                                                 // image file
                                                                 // name
      
              // start the video capture Intent
              startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
          }
      
          /**
           * Receiving activity result method 
           * will be called after closing the camera
           * */
          @Override
          protected void onActivityResult(int requestCode, 
                                          int resultCode, Intent data) {
      
              // if the result is capturing Image
              if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
                  if (resultCode == RESULT_OK) {
                      // successfully captured the image
                      // display it in image view
                      previewCapturedImage();
                  } else if (resultCode == RESULT_CANCELED) {
                      // user cancelled Image capture
                      Toast.makeText(getApplicationContext(),
                              "User cancelled image capture", Toast.LENGTH_SHORT)
                              .show();
                  } else {
                      // failed to capture image
                      Toast.makeText(getApplicationContext(),
                              "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                              .show();
                  }
              } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
                  if (resultCode == RESULT_OK) {
                      // video successfully recorded
                      // preview the recorded video
                      previewVideo();
                  } else if (resultCode == RESULT_CANCELED) {
                      // user cancelled recording
                      Toast.makeText(getApplicationContext(),
                              "User cancelled video recording", Toast.LENGTH_SHORT)
                              .show();
                  } else {
                      // failed to record video
                      Toast.makeText(getApplicationContext(),
                              "Sorry! Failed to record video", Toast.LENGTH_SHORT)
                              .show();
                  }
              }
          }
      
          /*
           * Display image from a path to ImageView
           */
          private void previewCapturedImage() {
              try {
                  // hide video preview
                  videoPreview.setVisibility(View.GONE);
      
                  imgPreview.setVisibility(View.VISIBLE);
      
                  // bimatp factory
                  BitmapFactory.Options options = new BitmapFactory.Options();
      
                  // downsizing image as it throws OutOfMemory Exception for larger
                  // images
                  options.inSampleSize = 8;
      
                  final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                          options);
      
                  imgPreview.setImageBitmap(bitmap);
              } catch (NullPointerException e) {
                  e.printStackTrace();
              }
          }
      
          /*
           * Previewing recorded video
           */
          private void previewVideo() {
              try {
                  // hide image preview
                  imgPreview.setVisibility(View.GONE);
      
                  videoPreview.setVisibility(View.VISIBLE);
                  videoPreview.setVideoPath(fileUri.getPath());
                  // start playing
                  videoPreview.pause();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
          /**
           * ------------ Helper Methods ---------------------- 
           * */
      
          /*
           * Creating file uri to store image/video
           */
          public Uri getOutputMediaFileUri(int type) {
              return Uri.fromFile(getOutputMediaFile(type));
          }
      
          /*
           * returning image / video
           */
          private static File getOutputMediaFile(int type) {
      
              // External sdcard
              // location.getExternalStoragePublicDirectory(
              // Environment.DIRECTORY_PICTURES),IMAGE_DIRECTORY_NAME);
              File mediaStorageDir = new File(
                      Environment
                              .getExternalStorageDirectory(),
                      IMAGE_DIRECTORY_NAME);
      
              // Create the storage directory if it does not exist
              if (!mediaStorageDir.exists()) {
                  if (!mediaStorageDir.mkdirs()) {
                      Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                              + IMAGE_DIRECTORY_NAME + " directory");
                      return null;
                  }
              }
      
              // Create a media file name
              String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss",
                      Locale.getDefault()).format(new Date());
              File mediaFile;
              if (type == MEDIA_TYPE_IMAGE) {
                  mediaFile = new File(mediaStorageDir.getPath() + File.separator
                          + "IMG_" + timeStamp + ".jpg");
              } else if (type == MEDIA_TYPE_VIDEO) {
                  mediaFile = new File(mediaStorageDir.getPath() + File.separator
                          + "VID_" + timeStamp + ".mp4");
              } else {
                  return null;
              }
      
              return mediaFile;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        相关资源
        最近更新 更多