web-dev-qa-db-ja.com

カメラから返されたonActivityResult、Intent null

Android開発サイト のカメラの指示に従います

自分でカメラを作成するのではなく、Camera Intentを開始するだけです。

写真を撮った後の結果の戻りを処理するサンプルコードは次のとおりです。

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Image captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Image saved to:\n" +
                    data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }

    if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Video captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Video saved to:\n" +
                    data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the video capture
        } else {
            // Video capture failed, advise user
        }
    }
}

resultCodeは問題ありませんが、dataは常にNULLであり、NPEが発生します。私はSDカードを見ました、写真は本当にそこに保存されていました。ヒントはありますか?たくさん。

更新:要求どおりのlogcat情報:

   01-28 19:39:00.547: ERROR/AndroidRuntime(24315): FATAL EXCEPTION: main
    Java.lang.RuntimeException: Unable to resume activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: Java.lang.NullPointerException
    at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2455)
    at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:2483)
    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1997)
    at Android.app.ActivityThread.handleRelaunchActivity(ActivityThread.Java:3362)
    at Android.app.ActivityThread.access$700(ActivityThread.Java:127)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1162)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:137)
    at Android.app.ActivityThread.main(ActivityThread.Java:4511)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:511)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:980)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:747)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: Java.lang.NullPointerException
    at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2991)
    at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2442)
    ... 13 more
    Caused by: Java.lang.NullPointerException
    at com.example.CameraTest.MyCamera.onActivityResult(MyCamera.Java:71)
    at Android.app.Activity.dispatchActivityResult(Activity.Java:4654)
    at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2987)
    ... 14 more                                                                                      
17

コードの問題は次のとおりです。

data.getData()

この呼び出しは、返されたIntentからキー "data"を含むを取得しません。おそらくdataである、返されたIntentからフィールドnullを取得します。

次のように、返されたIntentから追加を取得する必要があります。

data.getExtras().get("data");

他の回答のいくつかはこれを示しており、他の多くのコードに埋め込まれています。そのため、問題が何であるかを実際に確認することは困難です。

23
David Wasser

これは同様の質問からの答えです 。サムスンの携帯電話に問題があるようです...

基本的に、インテントを作成する このようなコード がある場合:

_Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
_

次に、onActivityResultで、_data.getData()fileUri.toString()に置き換えると、問題が解決します。

8
KJ50

@ KJ50のソリューションを使用し、savedInstanceStateを使用して、nullを取得しないようにします。

/**
     * Here we store the file url as it will be null after returning from camera
     * app
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        // save file url in bundle as it will be null on screen orientation
        // changes
        outState.putParcelable("file_uri", fileUri);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        // get the file url
        fileUri = savedInstanceState.getParcelable("file_uri");
    }
3
Darpan

以下のコードを試してください:

 Button m_btnCamera;
  ImageView m_ivCaptureImage;
  String m_curentDateandTime;
  String m_imagePath;
  Bitmap m_bitmap;

   //Start camera to caputre image.
 Intent m_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  m_intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
  startActivityForResult(m_intent, TAKE_PHOTO_CODE);

 private Uri getImageUri() throws CustomException
    {
    Uri m_imgUri = null;
    File m_file;
    try
    {
        SimpleDateFormat m_sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        m_curentDateandTime = m_sdf.format(new Date());
        m_imagePath = File.getPath() + File.separator + m_curentDateandTime + ".jpg";
        m_file = new File(m_imagePath);
        m_imgUri = Uri.fromFile(m_file);
    }
    catch (Exception p_e)
    {}      
    return m_imgUri;        
}

 @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data)
  {
  super.onActivityResult(requestCode, resultCode, data);
 if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK)
    {
        m_bitmap = ImageHelper.scaleImage(m_imagePath, 200, 200);
            m_bitmap = ImageHelper.rotateImage(m_bitmap, true, m_rotate);
            m_ivCaptureImage.setImageBitmap(m_bitmap);
    }
  }
}
2
GrIsHu

このコードはあなたを助けます

GetData()メソッドは、AndroidバージョンがMより新しい場合のみデータを返します。それ以外の場合は、nullの結果を返します。

if (resultCode == Activity.RESULT_OK) {

                //Check Android version, as intent.getData() will return data only if v is above or equal to M otherwise the data will be null
                if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
                    Uri selectedImageURI = imageReturnedIntent.getData();
                    Toast.makeText(getActivity(), "URI Path:" + selectedImageURI, Toast.LENGTH_LONG).show();
                } else {
                    Bitmap photo = (Bitmap) imageReturnedIntent.getExtras().get("data");
                    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
                    String path = MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), photo, "Title", null);
                    Uri selectedImageURI = Uri.parse(path);
                    Toast.makeText(getActivity(), "URI Path:" + selectedImageURI, Toast.LENGTH_LONG).show();
                }
            }
0

これを試して

public void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {
        case PICK_IMAGE_ID:

            Bitmap bitmap = ImagePicker.getImageFromResult(this.getActivity(), resultCode, data);

            if(data!=null){
                //set image view
            }
            break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
            break;
    }
}
0
A.G.THAMAYS