如何无意地从相机中捕捉照片

时间:2013-08-17 17:42:37

标签: android android-intent camera image-capture

我希望我的应用能够在不使用其他应用的情况下捕获照片。我使用的代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File photo = null;
    try
    {
        photo = this.createTemporaryFile("picture", ".jpg");
        photo.delete();
    }
    catch(Exception e)
    {
        Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();

    }
    mImageUri = Uri.fromFile(photo);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

但是此代码使用手机的主要相机应用程序。谁能给我一些代码?

3 个答案:

答案 0 :(得分:4)

直接使用Camera课程拍照是非常复杂的。

我正在使用a library to simplify this,您只需在应用中为基本预览界面添加CameraFragment,然后在其上调用takePicture()即可拍摄照片,并以各种方式配置行为(例如,保存图片的位置)。但是,这个库仍在进行中。

  

有人能给我一些代码吗?

“一些代码”将长达数千行(用于完整的实现,包括处理各种特定于设备的特殊情况)。

欢迎阅读the Android developer documentation on the subject

答案 1 :(得分:1)

设置完相机预览后,您需要执行以下操作...

protected static final int MEDIA_TYPE_IMAGE = 0; 

public void capture(View v)
{   
    PictureCallback pictureCB = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera cam) {
          File picFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
          if (picFile == null) {
            Log.e(TAG, "Couldn't create media file; check storage permissions?");
            return;
          }

          try {
            FileOutputStream fos = new FileOutputStream(picFile);
            fos.write(data);
            fos.close();
          } catch (FileNotFoundException e) {
            Log.e(TAG, "File not found: " + e.getMessage());
            e.getStackTrace();
          } catch (IOException e) {
            Log.e(TAG, "I/O error writing file: " + e.getMessage());
            e.getStackTrace();
          }
        }
      };
      camera.takePicture(null, null, pictureCB);
}

getOutputMediaFile函数:

private File getOutputMediaFile(int type) 
{
      File dir = new File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), getPackageName());
      if (!dir.exists()) 
      {
        if (!dir.mkdirs()) 
        {
          Log.e(TAG, "Failed to create storage directory.");
          return null;
        }
      }
      String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.UK).format(new Date());
      if (type == MEDIA_TYPE_IMAGE) 
      {
        return new File(dir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");
      } 
      else 
      {
        return null;
      }
}

你已经完成了!!!

找到它here

答案 2 :(得分:0)

相机在API 21中已弃用,新方法是使用android.hardware.camera2

  

要枚举,查询和打开可用的相机设备,请获取一个CameraManager实例。

要快速总结:

  1. 通过调用Context.getSystemService(String)
  2. 获取摄像机管理器实例
  3. 通过调用string[]获得CameraManager.GetCameraIdList()的设备相机ID。
  4. 使用上一步中所需的摄像机ID调用CameraManager.OpenCamera(...)。

打开摄像机后,将调用OpenCamera(...)中提供的回调。