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

时间:2015-08-29 07:56:01

标签: android android-camera camera2

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

我已为不推荐的相机版本,焦点和前置摄像头添加了对清单的权限。我一直在查阅教程并学习代码。

  1. 我还尝试使用一些自定义按钮添加框架布局预览,但我真的不知道如何使按钮布局覆盖框架。

  2. 我需要使用片段吗?

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

2 个答案:

答案 0 :(得分:0)

如果您搜索代码,请尝试以下示例代码(我在How to move image captured with the phone camera from one activity to an image view in another 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;
    }

如果使用模拟器进行测试,请确保支持相机:

enter image description here

答案 1 :(得分:0)

我不认为我可以给你一个确切的答案,因为这是一个很难回答的问题。但我会尽力为您的方法提供一些高级指导。

通常使用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

了解更多信息

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

因此,决定你想要达到的目标。如果您只想获得照片并保存,您只需使用Intent并请求相机应用程序为您的应用拍摄照片。

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

开始

编辑,

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

if (Build.VERSION.SDK_INT > 9) { 

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