在Android上从相机中检索图像

时间:2014-05-16 17:25:57

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

ALL,

我有以下代码:

    try
    {
        Intent captureIntent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
        File storage = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES );
        cameraImageFiles = File.createTempFile( "user_photo", ".png", storage );
        captureIntent.putExtra( MediaStore.EXTRA_OUTPUT, Uri.fromFile( cameraImageFiles ) );
        final Intent galleryIntent = new Intent();
        galleryIntent.setType( "image/*" );
        galleryIntent.setAction( Intent.ACTION_GET_CONTENT );
        Intent photoIntent = Intent.createChooser( galleryIntent, "Select or take a new picture" );
        photoIntent.putExtra( Intent.EXTRA_INITIAL_INTENTS, new Intent[] { captureIntent } );
        startActivityForResult( photoIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );
    }
    catch( IOException e )
    {
        Utils.displayErrorDialog( context, e.getMessage() );
    }

网上的每个例子都在谈论当只有一个意图时从相机中检索图像。

在这里,我有一个IntentChooser可以在图库图像之间进行选择,或者用相机拍摄新照片。据我所知,使用此代码我将无法简单地获取图像,因为在" onActivityResult()"我应该将图片保存到文件中 - 它不会自动保存。

现在我想做的是从相机拍摄中获取图像。我真的不在乎它是否会被保存 - 我只想要一张照片。

我知道如何从图库中获取图像 - 我有这个代码并且它有效。但是从相机中获取图像现在就是一个难题。

谢谢。

[编辑] 这是我放在onActivityResult()

中的代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE )
    {
        if( resultCode == RESULT_OK )
        {
            Uri uri = null;
            if( data == null )
            {
                if( cameraImageFiles.exists() )
                {
                    uri = Uri.fromFile( cameraImageFiles );
                    InputStream input;
                    try
                    {
                        input = getContentResolver().openInputStream( uri );
                        BitmapFactory.Options opts = new BitmapFactory.Options();
                        opts.inJustDecodeBounds = true;
                        bmp = BitmapFactory.decodeStream( input, null, opts );
                        input.close();
                        int height = opts.outHeight;
                        int width = opts.outWidth;
                        int inSampleSize = 1;
                        int reqHeight = camera.getHeight();
                        int reqWidth = camera.getWidth();
                        if( height > reqHeight || width > reqWidth )
                        {
                            int halfHeight = height / 2;
                            int halfWidth = width / 2;
                            while( ( halfHeight / inSampleSize ) > reqHeight && ( halfWidth / inSampleSize ) > reqWidth )
                                inSampleSize *= 2;
                        }
                        opts.inSampleSize = inSampleSize;
                        opts.inJustDecodeBounds = false;
                        bmp = BitmapFactory.decodeStream( input, null, opts );
                        camera.setImageBitmap( bmp );
                    }
                    catch( FileNotFoundException e )
                    {
                        Utils.displayErrorDialog( this, e.getMessage() );
                    }
                    catch( IOException e )
                    {
                        Utils.displayErrorDialog( this, e.getMessage() );
                    }
                }
                photoReady = true;
            }

执行后,代码将null设为bmp,因此我猜想图像未保存。

[/编辑]

1 个答案:

答案 0 :(得分:0)

相机会将拍摄的照片保存在磁盘上,但它不会是PNG,它将是Jpeg。此外,如果您使用ACTION_IMAGE_CAPTURE,数据将不会为null,因此您的代码根本不起作用。此外,应谨慎启动摄像头捕获意图,以避免捕获许多设备的well documented bug。请参阅https://stackoverflow.com/a/16433874/192373及其周围。

请注意,ACTION_GET_CONTENT需要对KitKat进行特殊处理,ACTION_OPEN_DOCUMENT可能会提供更好的服务,请参阅https://stackoverflow.com/a/20177611/192373