从我的应用程序中拍摄照片的可用选项

Available options to take Pictures from My Application

我一直在尝试创建一个 Android 相机 activity 来测试它在模拟器上的工作方式,但我不确定我做的是否正确。

我已将已弃用的相机版本、焦点和前置相机的权限添加到清单中。而且我一直在查找教程和学习代码。

  1. 我也尝试过包含一些自定义按钮的框架布局预览,但我真的不知道如何让按钮布局覆盖框架。

  2. 我需要使用片段吗?

  3. 另外我应该提到我已经阅读了新的 "camera2" 并且我有兴趣将它实现到相同的 activity,但也许这对一个人来说太多了简单的测试。您对此有何建议?

如果你搜索代码,试试下面的示例代码(我在也有答案,你可以看看)。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        mFileUri = Uri.fromFile(getOutputMediaFile(1));

        intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);

        // start the image capture Intent
        startActivityForResult(intent, 100);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

        if (resultCode == RESULT_OK) {
            if (mFileUri != null) {
                // do something...
            }
        }            
    }

    private static File getOutputMediaFile(int type) {

        // External sdcard location
        File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera");

        // Create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                return null;
            }
        }

        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
        File mediaFile;
        if (type == 1) { // image
            mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
        } else if (type == 2) { // video
            mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
        } else {
            return null;
        }

        return mediaFile;
    }

如果使用模拟器进行测试,请确保摄像头支持如下:

我不认为我可以给你一个准确的答案,因为回答这个问题是非常大胆的事情。但我会尝试为您的方法提供一些高级指导。

通常使用 Fragments 是编写 Android 应用程序的最佳方式,现在是推荐的方式。

您可以使用 Android 中的 Intents 让另一个应用程序代表您的应用程序工作。您可以启动安装在您设备上的相机应用程序来代表您的应用程序拍摄图像。

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

您可以从 here

阅读更多内容

但是如果您想编写自己的自定义相机 API,这些相机 API 就会发挥作用。因为在某些情况下,您实际上需要自己的自定义相机功能来满足您正在构建的应用程序的特殊要求。

所以决定你想要达到的目标是什么。如果您只想获取照片并保存,您可以简单地使用 Intent 并请求相机应用程序为您的应用程序拍摄照片。

要更深入地了解相机 API,您可以从 here

开始

编辑,

是的,您实际上可以执行以下操作

if (Build.VERSION.SDK_INT > 9) { 

并且根据版本有不同的执行路径。