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

但此代码使用手机的主摄像头应用程序。谁能给我一些代码?

4

3 回答 3

4

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

我正在开发一个库来简化这一点,您只需CameraFragment在应用程序中添加一个用于基本预览 UI 的应用程序,并调用takePicture()它来拍照,并使用各种方式来配置行为(例如,保存图片的位置)。但是,这个库仍在进行中。

谁能给我一些代码?

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

欢迎您阅读有关该主题的 Android 开发人员文档

于 2013-08-17T17:51:17.270 回答
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;
      }
}

你完成了!

这里找到

于 2014-07-08T10:05:20.983 回答
1

API 21 中不推荐使用相机,新方法是使用android.hardware.camera2

要枚举、查询和打开可用的摄像头设备,请获取一个CameraManager实例。

快速总结一下:

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

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

于 2018-11-12T01:12:09.593 回答