如何在不使用意图的情况下从相机中拍摄照片

7

我希望我的应用程序可以直接拍照而不需要使用其他应用程序。我使用的代码如下:

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个回答

4
使用Camera类直接拍照是非常复杂的。 我正在开发简化此过程的库,您只需在应用程序中添加CameraFragment以获取基本预览UI,并调用takePicture()来拍照,以各种方式配置行为(例如保存图片的位置)。但是,这个库仍然在不断改进中。
“一些代码”将会有成千上万行(包括处理各种设备特定的怪癖)。 您可以阅读Android开发人员文档了解更多信息。

@mremremre1:"我有一个使用mediarecorder来录制视频的应用程序,它不是很大"——那么我怀疑您没有处理所有设备。仅为纵向/横向和后置/前置摄像头获得正确的预览需要很多工作。“如果我使用camera = Camera.open();打开相机,并像文档中所示使用Camera.takePicture(),那该怎么办?”——那肯定是起点。 - CommonsWare
谢谢,我会尝试的。你看到另一个问题了吗?因为如果有一种直接从SurfaceView获取截图的方法,我就不必使用相机API了。 - mremremre1
据我所知,您无法对SurfaceView进行截屏。 - CommonsWare
该死。那我会尝试拍照并将其与布局XML的屏幕截图叠加。 - mremremre1
如果您的应用程序仅适用于API Level 14+,则可以查看TextureView是否允许您截取屏幕截图(https://developer.android.com/reference/android/view/TextureView.html),尽管我怀疑这也不起作用。 - CommonsWare
显示剩余3条评论

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;
      }
}

你完成了!!!

在这里找到它


谢天谢地:D - Pontios

1

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

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

简要总结:

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

相机打开后,将调用OpenCamera(...)中提供的回调函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接