如何从Android片段中的相机获取图像

Posted

技术标签:

【中文标题】如何从Android片段中的相机获取图像【英文标题】:How to get image from camera from fragment in Android 【发布时间】:2017-08-12 13:25:06 【问题描述】:

在我的代码中,位图为空,但图像创建成功,uri 很好,但 BitmapFactory.decodeFile() 返回空。

我在代码下面使用了片段:

public class CameraImage extends Fragment 

private static final int TAKE_PHOTO_CODE = 1888;
Button button;
private Uri fileUri1,fileUri;
ImageView imageView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 

    final View rootView = inflater.inflate(R.layout.camera_image,
            container, false);

    button = (Button) rootView.findViewById(R.id.button);
    imageView = (ImageView) rootView.findViewById(R.id.imageview);

    button.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View view) 

           Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    fileUri1 = getOutputMediaFileUri();
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);

        
    );

    return rootView;



@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (requestCode == TAKE_PHOTO_CODE) 
        if (resultCode == Activity.RESULT_OK) 

           BitmapFactory.Options options;


                try 
                    Bitmap bitmap = BitmapFactory.decodeFile(pathname);
                    showDialog(bitmap, 1);
                 catch (OutOfMemoryError e) 
                    try 
                        options = new BitmapFactory.Options();
                        options.inSampleSize = 2;
                        Bitmap bitmap = BitmapFactory.decodeFile(pathname, options);
                        imageView.setImageBitmap(bitmap);
                     catch (Exception e2) 
                        Log.e("Camera", "" + e2 + "    " + e);
                    
                
        
            
    

public Uri getOutputMediaFileUri() 
    return Uri.fromFile(getOutputMediaFile());


private static File getOutputMediaFile() 

    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(MyApplication.getAppContext().getFilesDir().getAbsolutePath()),
            IMAGE_DIRECTORY_NAME);

    if (!mediaStorageDir.exists()) 
        if (!mediaStorageDir.mkdirs()) 
            Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                    + IMAGE_DIRECTORY_NAME + " directory");
            return null;
        
    
    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).format(new Date());
    File mediaFile;

    try 
        mediaFile = File.createTempFile(
                "IMG_" + timeStamp,  
                ".jpg",         
                mediaStorageDir      
        );
     catch (Exception e) 
        Log.e("Camera", "" + e);
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                , "IMG_" + timeStamp + ".jpg");
    
    return mediaFile;

在上面的代码中,我在 onActivityResult 的位图上得到了 null,但我从这个图像中得到的 uri 出现在那个位置。

【问题讨论】:

【参考方案1】:

我们可以通过相机获得两种类型的图像:

1) 在 onActivityResult 中使用以下代码的缩略图:

Bitmap photo = (Bitmap) data.getExtras().get("data");
                Log.i(TAG, "" + photo + "  /  " + data.getExtras().get("data") + "  / " + data.getData());
                showDialog(photo, 1);

2) 在 onActivityResult 中使用以下代码获得完整质量的图像:

BitmapFactory.Options options;
                options = new BitmapFactory.Options();
                options.inSampleSize = 2;
                Bitmap bitmap = BitmapFactory.decodeFile(pathname, options);
                showDialog(bitmap, 1);

3) 轻松舒适地使用第三方:

编译'com.mindorks:paracamera:0.2.2'

paracamera github

【讨论】:

【参考方案2】:

我解决了我的问题:

通过更改cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri1);

【讨论】:

只是我的错误 您在某处是否还有另一个名为fileUri 的变量?它不在您在此处发布的代码中。 当变量名末尾有数字时,您可能做错了什么。在这种情况下,您需要创建更具描述性的名称。您尤其应该注意每个变量都是不同的并且易于识别。变量名不应该太相似以至于容易混淆。 此外,您应该尽可能地使用局部变量而不是成员字段。由于 fileUri1 仅在 onCreateViewI() 内部使用,因此在此处声明它,就像您最初所做的那样。 fileUri 很可能也用在单个方法中,而不是在方法之间共享,所以它也应该是本地的。此更改将帮助您避免像您在发布此问题之前遇到的错误。

以上是关于如何从Android片段中的相机获取图像的主要内容,如果未能解决你的问题,请参考以下文章

android使用片段从相机或画廊获取照片[重复]

如何使用 Qt/C++ 小部件(不是 QML)从 Android 相机获取图像

从片段中的相机意图返回后屏幕变为白色

如何将旋转按钮添加到 Android 图像裁剪屏幕?

在android中单击相机后,无需按确定按钮即可从相机获取图像

Android中的相机,如何获得最佳尺寸,预览尺寸,图片尺寸,视图尺寸,图像失真