麻烦用相机在工作onActivityResult [英] Trouble working with the camera in onActivityResult

查看:133
本文介绍了麻烦用相机在工作onActivityResult的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个选项中选择照片和拍照 - 我有我的选择照片的功能完全正常的,但有问题的拍摄照片。主要有在我的图像视图保存的图像显示,它被保存后。

定义我的照片位置:

 公共类光催化活性延伸活动{
      私人字符串photoPath;
      私人ImageView的imgView;
{...}
 

我的相机监听器:

  bPicFromCam.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(视图v){

            字符串状态= Environment.getExternalStorageState();

            如果(Environment.MEDIA_MOUNTED.equals(州)){

                长captureTime = System.currentTimeMillis的();

                photoPath = Environment.getExternalStorageDirectory()+/ MYAPP+ captureTime +.JPG;

                getPicFromCam(五);
            }
            其他{

                Toast.makeText(getApplicationContext(),
                    对不起,没有访问您的SD卡,出了问题+
                    请选择您的画廊的照片来代替。Toast.LENGTH_LONG).show();
            }

        }
    });
 

然后我的code键启动相机的意图(注意photoPath是正确的):

 公共无效getPicFromCam(查看视图){

    的System.out.println(photoPath:+ photoPath);
    //输出正确的位置!

    尝试{

        意向意图=新的意图(android.media.action.IMAGE_CAPTURE);
        档案照片=新的文件(photoPath);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(照片));
        imageUri = Uri.fromFile(照片);
        startActivityForResult(Intent.createChooser(意向,捕捉图像),CAPTURE_IMAGE);

    }赶上(例外五){
        Toast.makeText(getApplicationContext(),
                的getString(R.string.exception_message)
                Toast.LENGTH_LONG).show();
        Log.e(e.getClass()的getName(),e.​​getMessage(),E。);
    }
}
 

确定一切似乎罚款,直到这一点 - 在拍摄照片和图像被保存到指定的位置

现在我想在我的图像视图中显示的图像(然后就可以在用户确认其良好的售后服务上传)。

我的onActivityResult:

  @覆盖
保护无效onActivityResult(INT申请code,INT结果code,意图数据){
    super.onActivityResult(要求code,因此code,数据);

    开关(要求code){
    案例PICK_IMAGE:
        如果(结果code == Activity.RESULT_OK){
            //这个工程
        }
        打破;

    案例CAPTURE_IMAGE:

        如果(结果code == RESULT_CANCELED){
          吐司面包= Toast.makeText(这一点,取消了,没有照片的选择。,1000);
          toast.show();
          返回;
         }

        如果(要求code == CAPTURE_IMAGE和放大器;&安培;结果code == RESULT_OK)
         {

            尝试 {

                的System.out.println(photoPath+ photoPath);
                //这是空!而我的问题,HALP!

                BitmapFactory.Options bitmapOptions =新BitmapFactory.Options();
                bitmapOptions.inSampleSize = 6;
                位= BitmapFactory.de codeFILE(photoPath,bitmapOptions);

                imgView.setImageBitmap(位);


            }赶上(例外五){
                Toast.makeText(getApplicationContext(),内部错误,
                        Toast.LENGTH_LONG).show();
                Log.e(e.getClass()的getName(),e.​​getMessage(),E。);

            }

         }

        打破;
    默认:
    }
}
 

多数民众赞成的方式,我目前正在努力,但我也尝试过使用我的onActivityResult如下:

 位=(位图)data.getExtras()获得(数据)。
 

但每一次我尝试了上述方法的变化,我收到了NPE。

编辑:

  03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):空
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):显示java.lang.NullPointerException
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在com.myco.photoapp.SelectPhoto.onActivityResult(SelectPhoto.java:277)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.Activity.dispatchActivityResult(Activity.java:3890)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:3115)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.ActivityThread.access $ 2300(ActivityThread.java:125)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.os.Handler.dispatchMessage(Handler.java:99)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.os.Looper.loop(Looper.java:123)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在android.app.ActivityThread.main(ActivityThread.java:4627)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在java.lang.reflect.Method.invokeNative(本机方法)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在java.lang.reflect.Method.invoke(Method.java:521)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-11 19:28:56.319:错误/显示java.lang.NullPointerException(16391):在dalvik.system.NativeStart.main(本机方法)
 

以上NPE来的时候:

  //下面是线277
字符串结果= data.toURI();

                BitmapFactory.Options bitmapOptions =新BitmapFactory.Options();

                bitmapOptions.inSampleSize = 6;
                位= BitmapFactory.de codeFILE(结果,bitmapOptions);
 

解决方案

您的活动很可能被破坏并重新创建时相机活动是怎么回事了。也许尝试保存photoPath成捆的onSaveInstanceState中,然后鱼回出的onCreate(请务必为您在的onCreate空当你这样做的话)?

I have two options "select photo" and "take photo" - I have my select photo functionality fully working, but having problems with taking a photo. Mainly having the saved image display in my image view, after its been saved.

Defined my photo location:

public class photoActivity extends Activity {   
      private String photoPath;
      private ImageView imgView;
{...} 

My camera listener:

bPicFromCam.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state)) {

                long captureTime = System.currentTimeMillis();

                photoPath = Environment.getExternalStorageDirectory() + "/MYAPP" + captureTime + ".jpg";

                getPicFromCam(v);
            }
            else{

                Toast.makeText(getApplicationContext(),
                    "Sorry there is a problem accessing your SDCard, " +
                    "please select a picture from your gallery instead.", Toast.LENGTH_LONG).show();
            }

        }
    });

Then my code to start the camera intent (note that the photoPath is correct):

    public void getPicFromCam(View view){

    System.out.println("photoPath: " + photoPath);
    //Outputs the CORRECT location!

    try{

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        File photo = new File(photoPath);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(photo));
        imageUri = Uri.fromFile(photo);
        startActivityForResult(Intent.createChooser(intent, "Capture Image"), CAPTURE_IMAGE);

    } catch (Exception e) {
        Toast.makeText(getApplicationContext(),
                getString(R.string.exception_message),
                Toast.LENGTH_LONG).show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
    }
}

OK everything seems fine up until this point - the picture is taken and the image gets saved to the specified location.

Now I am trying to display the image in my Image view (then it can be uploaded after the user confirms its good).

My onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case PICK_IMAGE:
        if (resultCode == Activity.RESULT_OK) {
            //THIS WORKS
        }
        break;

    case CAPTURE_IMAGE:         

        if (resultCode == RESULT_CANCELED) {
          Toast toast = Toast.makeText(this,"Canceled, no photo selected.", 1000);
          toast.show();
          return;
         }

        if (requestCode == CAPTURE_IMAGE && resultCode == RESULT_OK)
         {

            try {

                System.out.println("photoPath " + photoPath);
                //This is NULL!!!  And my problem, halp!

                BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  
                bitmapOptions.inSampleSize = 6;  
                bitmap = BitmapFactory.decodeFile(photoPath, bitmapOptions);

                imgView.setImageBitmap(bitmap);


            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Internal error",
                        Toast.LENGTH_LONG).show();
                Log.e(e.getClass().getName(), e.getMessage(), e);

            }

         }

        break;
    default:
    }
}

Thats the way I am currently trying it, but I have also tried using the following in my onActivityResult:

bitmap = (Bitmap) data.getExtras().get("data");

But every time I try and variation of the above method I get a NPE.

EDIT:

    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): null
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): java.lang.NullPointerException
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.myco.photoapp.SelectPhoto.onActivityResult(SelectPhoto.java:277)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3115)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.os.Looper.loop(Looper.java:123)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at java.lang.reflect.Method.invokeNative(Native Method)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at java.lang.reflect.Method.invoke(Method.java:521)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at dalvik.system.NativeStart.main(Native Method)

Above NPE comes when:

//below is line 277
String result = data.toURI();

                BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  

                bitmapOptions.inSampleSize = 6;  
                bitmap = BitmapFactory.decodeFile(result, bitmapOptions);

解决方案

Your Activity is probably being destroyed and re-created when the camera activity is going off. Maybe try saving photoPath into the Bundle in onSaveInstanceState and then fish it back out in onCreate (make sure to check for nulls in onCreate when you do so)?

这篇关于麻烦用相机在工作onActivityResult的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆