无法从 Android 文档中获取相机代码以正常工作

Posted

技术标签:

【中文标题】无法从 Android 文档中获取相机代码以正常工作【英文标题】:Can't get camera code from Android docs to work 【发布时间】:2016-07-23 12:21:30 【问题描述】:

我正在使用来自http://developer.android.com/training/camera/photobasics.html的代码

代码:

    private void dispatchTakePictureIntent() 
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) 
            File photoFile = null;
            try 
                photoFile = FileUtilities.createImageFile();
             catch (IOException ex) 
                // Error occurred while creating the File
                Toast.makeText(getActivity(),"Error!",Toast.LENGTH_SHORT).show();
            
            if (photoFile != null) 
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photoFile));
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            
        
    


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) 
            Bundle extras = data.getExtras(); //error
            //code after this doesn't get executed
        
    

我正在尝试访问缩略图和存储在设备上的图片。但是由于某种原因,当我尝试代码时,我在 data.getExtras(); 上得到一个空指针异常;部分。

我在这里错过了什么?

【问题讨论】:

希望您已在清单中声明了所需的所有权限。 我已经包含了,是的 data.getExtras()使用断点时会给出哪些东西? 这是一个空指针异常,所以我想它是空的(我现在不在笔记本电脑附近验证) @SeanHill // 这可能是我回答中的第 4 种情况。所以你需要检查if(data == null) 【参考方案1】:

这是臭名昭著的 Android 开发经验之一。

Android Intent 不保证在data.getExtras() 中提供捕获的图像,尤其是用户使用第 3 方相机/成像应用程序。您可以在here 和任何使用“android camera intent null”搜索的地方找到许多试验和建议。

其中一些常见的如下。

    data.getExtras().get("data"); data.getExtras() 具有不同的键(即“照片”) data.getData() Uri.fromFile(f)EXTRA_OUTPUT 预定义路径。 Uri.fromFile(f) 带有一些随机文件名(日期时间格式或 IMG-xxx)没有维护 EXTRA_OUTPUT 定义。

我建议您使用断点来查找意图给出的变量的哪个路径。最好在if-else if-else 方法中检查所有这些。

此外,发布应用后请仔细查看崩溃报告。您可能会从上述试验中得到错误。

【讨论】:

嗯?您是在暗示它是随机的/不一致的吗? @SeanHill // 我所说的 random 是指他们的(第 3 方相机应用程序)不可预测的文件名。 我只是尝试使用默认相机 @SeanHill // 你的意思是默认不是默认的,除非它是 Nexus。几乎所有 android 供应商(如三星或索尼)都将自己的相机应用程序作为默认设置,但它可能会或可能不会提供与文档相同的结果。 那么如果有这么多摄像头出现不可靠或不可预测的行为,大多数开发人员会怎么做?【参考方案2】:

要获取 ThumbNail,您无需创建文件等。请尝试以下代码。

   Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // Ensure that there's a camera activity to handle the intent
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) 
                    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                

并得到结果。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 

            if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) 
                Bundle extras = data.getExtras();
                Bitmap imageBitmap = (Bitmap) extras.get("data");
                imgView.setImageBitmap(imageBitmap);
            

    

imgView 是您要将 ThumbNail 设置为的 ImageView。

如果您想创建一个文件然后尝试此操作,[缩略图不需要],您可能需要在尝试读取和写入存储时尝试将以下权限添加到清单。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

一切顺利。

【讨论】:

我已经有权限了。我可以使用更简单的代码版本获取缩略图,但不能使用文件代码获取缩略图和完整图像

以上是关于无法从 Android 文档中获取相机代码以正常工作的主要内容,如果未能解决你的问题,请参考以下文章

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

从相机和图库上传在所有版本中都无法正常工作

Android Lollipop 问题 - 无法将图像从相机加载到 ImageView

无法从android相机获取输出缓冲区

Android 相机预览帧时间戳

Android相机预览始终是侧面的