Android 如何用自定义照相机活动替换MediaStore.ACTION\u IMAGE\u CAPTURE?

Android 如何用自定义照相机活动替换MediaStore.ACTION\u IMAGE\u CAPTURE?,android,android-camera,android-camera-intent,Android,Android Camera,Android Camera Intent,我有一个应用程序,它使用一个MediaStore.ACTION\u IMAGE\u CAPTURE来拍摄照片,然后将照片返回到一个OnActivityResult函数 但是,我想用我自己的定制相机活动来代替它,并将其集成到应用程序中 有没有关于这样做的指南?我是android新手,以前从未做过摄像头活动,也从未将摄像头连接到应用程序的其他部分 感谢您的帮助Android开发者页面上有一个基本指南: 简言之,您必须构建您想要的用于捕获图像的UI;通常您需要取景器SurfaceView或Textu

我有一个应用程序,它使用一个
MediaStore.ACTION\u IMAGE\u CAPTURE
来拍摄照片,然后将照片返回到一个
OnActivityResult
函数

但是,我想用我自己的定制相机活动来代替它,并将其集成到应用程序中

有没有关于这样做的指南?我是android新手,以前从未做过摄像头活动,也从未将摄像头连接到应用程序的其他部分


感谢您的帮助

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

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

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

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


在Android L中,有一个全新的API,它更强大,但是对于简单的用例,旧的摄像头API可以很好地工作。

我希望你已经找到了你想要的答案,但是对于其他人,我发现了一个制作你自己的摄像头应用程序的很好的教程。跳到底部,获取此问题的相关简短答案

这是我在花了几天的时间试图强迫我的文件输入接受旋转图像后,用来制作相机应用程序的东西

原生摄像头应用让我头疼(我也是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结果的一部分

上面的代码并不完全符合主题,但我认为很多人希望替换媒体商店选项,因为本机摄像头存在问题

回答:要让您的自定义相机弹出:只需进行另一项活动,并在那里编写您的相机代码。不要从动作图像捕获中更改它,否则它将无法正常返回(不要像我一样)

您还可以直接设置启动新摄影机活动的意图。 而不是
startActivityForResult(在意图、文件选择器\u结果代码之间选择)
使用:
startActivityForResult(DirectCustomCamerainent,文件选择器\u结果代码)
再说一次,不要像我一样。startActivityForResult是用于从活动中获取结果的工具,不要将其更改为startActivity

旁注:同一个YouTube教程的家伙也有一个关于旋转图像的视频。你不需要一个自定义的应用程序来旋转,只需像上面的代码一样制作一个位图,旋转它,然后将它写回onActivityResult顶部的原始文件,任何抓取该文件的东西都将具有正确的格式