【问题标题】:Error with image view when displaying an image by camera capturing通过相机捕获显示图像时图像视图出错
【发布时间】:2015-06-10 10:21:33
【问题描述】:

我是 android 新手,我正在尝试让我的手机摄像头拍照并在图像视图中显示它。当图像被捕获时,它被正确保存,但之后应用程序停止工作,当图像应该显示在图像视图中时。任何帮助表示赞赏。我搜索了一些主题,但仍然没有任何效果。 代码如下:

package myfirstapp.myapps.me.camera;

import ...

public class MainActivity extends ActionBarActivity {
    ImageButton camBtn;
    ImageView imageView;
    ScrollView scrollView;

    private File imageFile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void OpenCam(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        imageFile=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"image.jpg");
        Uri tempURI=Uri.fromFile(imageFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, tempURI);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 0)//==0 the same where startActivityForResult(intent, 0) so we are in the same process
        {


            switch (resultCode){
                case Activity.RESULT_OK:
                    if(imageFile.exists())
                    {
                        Toast.makeText(MainActivity.this, "Image was saved at "+imageFile.getAbsolutePath(), Toast.LENGTH_SHORT)
                                .show();
                        Bitmap myBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());

                        ImageView myImage = (ImageView) findViewById(R.id.imageView);

                        myImage.setImageBitmap(myBitmap);
                    }
                    else
                    {
                        Toast.makeText(MainActivity.this, "Image wasn't saved", Toast.LENGTH_SHORT)
                                .show();
                    }
                    break;
                case Activity.RESULT_CANCELED:
                    Toast.makeText(MainActivity.this, "Image capture was cancelled", Toast.LENGTH_SHORT)
                            .show();
                    break;
            }
        }
    }
}

堆栈跟踪

原因:java.lang.RuntimeException:传递结果失败 ResultInfo{who=null, request=0, result=-1, data=null} 到活动 {myfirstapp.myapps.me.camera/myfirstapp.myapps.me.camera.MainActivity}: java.lang.NullPointerException 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3410) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2817) 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2859)

【问题讨论】:

  • 我是安卓新手,这是什么意思?
  • 引起:java.lang.RuntimeException:将结果 ResultInfo{who=null, request=0, result=-1, data=null} 传递给活动 {myfirstapp.myapps.me.camera/ 失败myfirstapp.myapps.me.camera.MainActivity}:在 android.app.ActivityThread.deliverResults(ActivityThread.java:3410) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2817) 的 java.lang.NullPointerException .ActivityThread.handleResumeActivity(ActivityThread.java:2859)

标签: java android camera imageview


【解决方案1】:

请仔细阅读此代码:

    public static final int REQUEST_IMAGE_CAPTURE = 1;
    public static final int RESULT_LOAD_IMAGE = 10;
     private Bitmap myBitmap;
     ImageView myImage ;
        public void OpenCam(View view) {

              Intent takePictureIntent = new             Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    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();
            myBitmap= (Bitmap) extras.get("data");

             myImage = (ImageView) findViewById(R.id.imageView);

                    myImage.setImageBitmap(myBitmap);
        }

        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();

            myBitmap= BitmapFactory.decodeFile(picturePath);

            //          photoUri = picturePath;



        myImage.setImageBitmap(myBitmap);

        }

    }

【讨论】:

  • 06-10 06:46:58.126 3921-3921/myfirstapp.myapps.me.camera W/EGL_genymotion:eglSurfaceAttrib 未实现 06-10 06:46:58.130 3921-3921/myfirstapp.myapps。 me.camera E/OpenGLRenderer: 从 GradienCache 06-10 06:46:58.130 3921-3921/myfirstapp.myapps.me.camera E/OpenGLRenderer 获取 MAX_TEXTURE_SIZE: MAX_TEXTURE_SIZE: 16384 06-10 06:46:58.158 3921-3921/myfirstapp .myapps.me.camera E/OpenGLRenderer﹕从 Caches::initConstraints() 06-10 06:46:58.162 3921-3921/myfirstapp.myapps.me.camera E/OpenGLRenderer﹕获取 MAX_TEXTURE_SIZE﹕MAX_TEXTURE_SIZE: 16384
  • 引起:java.lang.RuntimeException:将结果 ResultInfo{who=null, request=0, result=-1, data=null} 传递给活动 {myfirstapp.myapps.me.camera/ 失败myfirstapp.myapps.me.camera.MainActivity}:在 android.app.ActivityThread.deliverResults(ActivityThread.java:3410) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2817) 的 java.lang.NullPointerException .ActivityThread.handleResumeActivity(ActivityThread.java:2859)
  • 它有效。先生,您能否使用一些 cmets 编辑代码以理解它们,以及与我已经发布的原始代码有什么不同。谢谢。
【解决方案2】:

您为什么要先保存并尝试显示保存的图像文件。使用从onActivityResult 返回的data。在内存中实际创建文件之前,会发送广播,以便刷新目录并显示新文件。但更好的是使用相机意图返回的数据。

替换您的此代码

Bitmap myBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());

                        ImageView myImage = (ImageView) findViewById(R.id.imageView);

                        myImage.setImageBitmap(myBitmap);

有了这个

ImageView myImage = (ImageView) findViewById(R.id.imageView);
Bitmap photo = (Bitmap) data.getExtras().get("data"); 
                myImage.setImageBitmap(photo);

【讨论】:

  • 我做到了。现在我收到了吐司消息,上面写着:图像未保存。
  • 引起:java.lang.RuntimeException:将结果 ResultInfo{who=null, request=0, result=-1, data=null} 传递给活动 {myfirstapp.myapps.me.camera/ 失败myfirstapp.myapps.me.camera.MainActivity}:在 android.app.ActivityThread.deliverResults(ActivityThread.java:3410) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2817) 的 java.lang.NullPointerException .ActivityThread.handleResumeActivity(ActivityThread.java:2859)
【解决方案3】:

first : 注释该行 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // no need to write 用于捕获相机

第二个:使用这一行

imageFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/abc); // abc folder name

而不是

imageFile=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"image.jpg");

注意:您的代码可以在 kitkat 上运行,但棒棒糖会崩溃,因为在棒棒糖 imageFile 返回 null 所以 Uri 无法在文件中转换。希望您的问题能够解决。在打开相机之前还有一件事,你应该检查 sdcard 权限。

【讨论】:

  • 先生,我是android新手,我可以改变这个项目的设置以在棒棒糖中编译还是我只是创建一个新项目?
  • 转到你的清单文件 (AndroidManifext.xml) 并更改 android:maxSdkversion=21
  • 引起:java.lang.RuntimeException:将结果 ResultInfo{who=null, request=0, result=-1, data=null} 传递给活动 {myfirstapp.myapps.me.camera/ 失败myfirstapp.myapps.me.camera.MainActivity}:在 android.app.ActivityThread.deliverResults(ActivityThread.java:3410) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2817) 的 java.lang.NullPointerException .ActivityThread.handleResumeActivity(ActivityThread.java:2859)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多