web-dev-qa-db-fra.com

onActivityResult renvoyé par une caméra, intention null

Je suis les instructions sur Appareil photo sur Site de développement Android

Je viens de commencer l'objectif de la caméra, pas construire ma propre caméra. 

L'exemple de code permettant de gérer le retour du résultat après avoir pris une photo est le suivant. 

 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 est OK, mais data est toujours NULL, ce qui provoque un NPE. J'ai regardé dans la carte SD, la photo était vraiment enregistrée là-bas. Une astuce? tks beaucoup.

Mise à jour: informations logcat comme demandé: 

   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
Taxi Noi Bai Ha Noi

Le problème avec votre code est le suivant:

data.getData()

Cet appel n'obtient pas le extra avec la clé "data" du Intent renvoyé. Il obtient le champ data à partir du Intent renvoyé, qui est probablement null.

Vous devez obtenir le supplément du Intent retourné comme ceci:

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

Certaines des autres réponses l'ont indiqué, intégrées à des tonnes d'autres codes. Cela rend difficile de voir réellement quel est le problème.

22
David Wasser

Voici la réponse d'une question similaire . Il semble que cela pourrait être un problème avec les téléphones Samsung ...

Fondamentalement, si vous avez un code comme celui-ci qui crée l'intention:

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);

Ensuite, dans onActivityResult, replace data.getData() avec fileUri.toString() et votre problème sera résolu.

8
KJ50

Utilisez la solution de @ KJ50 et utilisez savedInstanceState pour vous assurer que vous n'obtenez pas la valeur 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

Essayez ci-dessous le code:

 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

Ce code vous aidera

La méthode getData () renvoie des données uniquement si la version d'Android est plus récente que M, sinon elle renverra un résultat nul.

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
k33da_lets_debug

Essaye ça

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