如何用自定义相机活动替换MediaStore.ACTION_IMAGE_CAPTURE?

时间:2014-11-02 08:02:36

标签: android android-camera android-camera-intent

我有一个使用MediaStore.ACTION_IMAGE_CAPTURE意图拍摄照片的应用,然后将照片返回到OnActivityResult功能。

但是,我想将此替换为我自己的自定义相机活动,并将其集成到应用中。

有没有这方面的指南?我是Android的新手,我以前从未做过相机活动,或者把它连接到应用程序的其他部分。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

Android开发者网页上有一个基本指南:

http://developer.android.com/guide/topics/media/camera.html#custom-camera

简而言之,您必须构建捕获图像所需的UI;通常你会想要一个取景器SurfaceView或TextureView,然后是一些控件。

然后,您需要创建一个Camera对象,将取景器连接到它,然后启动预览。一旦开始,您可以拍照,更改缩放等设置。

有关详细信息和示例代码,请参阅指南。

在Android L中,有一个全新的Camera2 API,功能更强大,但对于简单的用例,较旧的相机API可以正常工作。

答案 1 :(得分:0)

我希望你已经找到了你想要的答案,但是对于遇到这篇文章的其他人 - 我找到了一个很好的教程来制作你自己的相机应用程序。跳到底部,找到这个问题的相关简短答案。

https://www.youtube.com/watch?v=CuvVpsFc77w&list=PL9jCwTXYWjDIHNEGtsRdCTk79I9-95TbJ是我用DAYS试图强制我的文件输入接受旋转图像后制作相机应用程序的。

原生相机应用让我很头疼(我也是Android新手)。我的文件输入太快(通过Webview)捕获图像,所以我尝试制作自己的相机应用程序来解决这个问题。 进行其他活动并输入相机代码 。当action.image.capture扫描应用程序时,它会弹出。我实际上更换了原生相机(但它只是显示了MainAppName,而不是专门的相机......如果点击它,自定义相机就会打开。我的确如此。)

制作我自己的相机应用让我意识到无论如何它始终保存在风景中。我伤心欲绝。 因此,对于那些想要使用自定义相机的人来说,他们需要在那里旋转它,只需获取活动结果上的数据就可以了:

Bitmap bitmap = BitmapFactory.decodeFile(mImageFileLocation);
    Bitmap rotatedBitmap = rotateImage(bitmap);
    OutputStream outputStream = null;

    try {
        outputStream = new FileOutputStream(photoFile);
        rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        outputStream.flush();
        outputStream.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
private Bitmap rotateImage(Bitmap bitmap) {
    ExifInterface exifInterface = null;
    try {
        exifInterface = new ExifInterface(mImageFileLocation);
    } catch (IOException e) {
        e.printStackTrace();
    }
    int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
    Matrix matrix = new Matrix();
    switch(orientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.setRotate(90);
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            matrix.setRotate(180);
            break;
        default:
    }
    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    return rotatedBitmap;

注意:RotateImage()不是OnActivity Result

的一部分

以上代码并不完全是主题,但我认为由于原生相机问题,很多人都想替换媒体商店选项。

答案:要让您的自定义相机弹出:只需制作另一个活动并在那里写下您的相机代码。不要从Action Image Capture中更改它,否则它将无法正常返回(不要像我一样)。

您还可以直接设置意图以启动新的相机活动。 而不是startActivityForResult(chooseBetweenTheseIntent, FILECHOOSER_RESULTCODE); 使用: startActivityForResult(directCustomCameraIntent, FILECHOOSER_RESULTCODE) 再说一次,不要像我一样。 startActivityForResult用于从活动中获取结果,而不是将其更改为startActivity。

旁注:同一个YouTube教程人员也有旋转图像的视频。您不需要自定义应用程序进行旋转,只需像上面的代码一样制作位图,旋转它,然后将其写回onActivityResult顶部的原始文件,以及任何抓取该文件将具有正确的格式。