web-dev-qa-db-fra.com

android camera: échec lors de la livraison du résultat ResultInfo {who = null, request = 0, result = -1, data = null} to activity

j'ai vraiment peur de résoudre mon problème, j'ai une application qui utilise l'appareil photo, lorsque l'appareil photo capture une photo, il s'affichera sur l'activité, quand je n'utilise pas cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); la photo s'affichera sur l'activité, mais le nom et le fichier de chemin ne correspondent pas à ce que je voulais. j'utilise galaxy tab pour le compiler, j'ai suivi le tutoriel pour résoudre mon problème depuis ici , ici et ici mais mon application force toujours fermer et eror, voici mon code:

{

                File sdCard= Environment.getExternalStorageDirectory();
                File path = new File (sdCard.getAbsolutePath() + "/Android/data/spaj_foto");
                path.mkdir();
                File file= new File (path,"spaj_foto.png");
                String filePath ="/Android/data/spaj_foto/spaj_foto.png";

                  try {
                      file.createNewFile();
                    } catch (IOException e) {}       


                 mPhotoUri = Uri.fromFile(file); 
                 values.put( MediaStore.Images.ImageColumns.DATA, file.getPath());
                 mPhotoUri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

                  Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
                  cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
                  startActivityForResult(cameraIntent,TAKE_PHOTO_CODE );  

            }

méthode de résultat d'activité:

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
                Bitmap photo = (Bitmap) data.getExtras().get("data"); 
                image_spaj.setImageBitmap(photo);


                // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
                Uri tempUri = getImageUri(getApplicationContext(), photo);

                // CALL THIS METHOD TO GET THE ACTUAL PATH
                File finalFile = new File(getRealPathFromURI(tempUri));

//              System.out.println(mImageCaptureUri);
            }  
        }
        public String getRealPathFromURI(Uri mPhotoUri) {
            Cursor cursor = getContentResolver().query(mPhotoUri, null, null, null, null); 
            cursor.moveToFirst(); 
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
            return cursor.getString(idx); 
        }

        public Uri getImageUri(Context inContext, Bitmap inImage) {
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
            return Uri.parse(path);
        }

voici mon logcat dit:

    09-27 10:59:43.186: E/AndroidRuntime(31318): Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {org.example.touch/org.example.touch.FormSpaj}: Java.lang.NullPointerException
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3179)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3222)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.app.ActivityThread.access$1100(ActivityThread.Java:140)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1276)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.os.Handler.dispatchMessage(Handler.Java:99)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.os.Looper.loop(Looper.Java:137)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.app.ActivityThread.main(ActivityThread.Java:4895)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Java.lang.reflect.Method.invokeNative(Native Method)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Java.lang.reflect.Method.invoke(Method.Java:511)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:994)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:761)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at dalvik.system.NativeStart.main(Native Method)
09-27 10:59:43.186: E/AndroidRuntime(31318): Caused by: Java.lang.NullPointerException
09-27 10:59:43.186: E/AndroidRuntime(31318):    at org.example.touch.FormSpaj.onActivityResult(FormSpaj.Java:993)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.app.Activity.dispatchActivityResult(Activity.Java:5347)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3175)
09-27 10:59:43.186: E/AndroidRuntime(31318):    ... 11 more

j'espère vraiment que quelqu'un pourra m'aider à résoudre mon problème, je suis déjà empilé et je ne peux plus penser de toute façon, s'il vous plaît quelqu'un m'aide ... merci.

28
Aoyama Nanami

Assurez-vous que vous disposez des autorisations Camera Permission et READ/WRITE External Storage.

Essayez cela fonctionne comme un charme avec moi

private String selectedImagePath = "";
    final private int PICK_IMAGE = 1;
    final private int CAPTURE_IMAGE = 2;

public Uri setImageUri() {
        // Store image in dcim
        File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png");
        Uri imgUri = Uri.fromFile(file);
        this.imgPath = file.getAbsolutePath();
        return imgUri;
    }


    public String getImagePath() {
        return imgPath;
    }

btnGallery.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);

            }
        });

        btnCapture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri());
                startActivityForResult(intent, CAPTURE_IMAGE);
            }
        });

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_CANCELED) {
            if (requestCode == PICK_IMAGE) {
                selectedImagePath = getAbsolutePath(data.getData());
                imgUser.setImageBitmap(decodeFile(selectedImagePath));
            } else if (requestCode == CAPTURE_IMAGE) {
                selectedImagePath = getImagePath();
                imgUser.setImageBitmap(decodeFile(selectedImagePath));
            } else {
                super.onActivityResult(requestCode, resultCode, data);
            }
        }

    }


public Bitmap decodeFile(String path) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, o);
            // The new size we want to scale to
            final int REQUIRED_SIZE = 70;

            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
                scale *= 2;

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeFile(path, o2);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;

    }

public String getAbsolutePath(Uri uri) {
        String[] projection = { MediaColumns.DATA };
        @SuppressWarnings("deprecation")
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }
21
Biraj Zalavadia

Essayez ceci, Hier, j'ai eu le même problème. en utilisant le code ci-dessous, je rectifie le problème. essayez-le.

Remarque: Et ajoutez également configChanges pour une activité particulière. lors de l'appel, l'activité de la caméra sera actualisée. vous devez éviter cela. Android:configChanges="orientation|keyboardHidden|screenSize"

btnGallery.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
           intent = new Intent(Intent.ACTION_PICK);
                            intent.setType("image/*");
                            startActivityForResult(intent, 1);
        }
    });

    btnCapture.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(
                                    MediaStore.ACTION_IMAGE_CAPTURE);
                            File file = new File(Environment
                                    .getExternalStorageDirectory(),
                                    "test.jpg");

                            outputFileUri = Uri.fromFile(file);
                            Log.d("TAG", "outputFileUri intent"
                                    + outputFileUri);
                            intent.putExtra(MediaStore.EXTRA_OUTPUT,
                                    outputFileUri);
                            startActivityForResult(intent, 0);
        }
    });

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case 0:
        if (resultCode == RESULT_OK) {
            Log.d("TAG", "outputFileUri RESULT_OK" + outputFileUri);
            if (outputFileUri != null) {

                Bitmap bitmap;
                bitmap = decodeSampledBitmapFromUri(outputFileUri,
                        image.getWidth(), image.getHeight());

                if (bitmap == null) {
                    Toast.makeText(getApplicationContext(),
                            "the image data could not be decoded",
                            Toast.LENGTH_LONG).show();

                } else {
                    Toast.makeText(
                            getApplicationContext(),
                            "Decoded Bitmap: " + bitmap.getWidth() + " x "
                                    + bitmap.getHeight(), Toast.LENGTH_LONG)
                            .show();
                    image.setImageBitmap(bitmap);
                }
            }
        }
        break;
    case 1:
        if (resultCode == RESULT_OK) {
            Uri targetUri = data.getData();
            Log.d("TAG", "datae" + targetUri);
            Bitmap bitmap;
            bitmap = decodeSampledBitmapFromUri(targetUri,
                    image.getWidth(), image.getHeight());

            if (bitmap == null) {
                Toast.makeText(getApplicationContext(),
                        "the image data could not be decoded",
                        Toast.LENGTH_LONG).show();

            } else {
                Toast.makeText(
                        getApplicationContext(),
                        "Decoded Bitmap: " + bitmap.getWidth() + " x "
                                + bitmap.getHeight(), Toast.LENGTH_LONG)
                        .show();
                image.setImageBitmap(bitmap);
            }
        }
        break;

    default:
        break;
    }
}

public Bitmap decodeSampledBitmapFromUri(Uri uri, int reqWidth,
        int reqHeight) {

    Bitmap bm = null;

    try {
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getContentResolver()
                .openInputStream(uri), null, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        bm = BitmapFactory.decodeStream(getContentResolver()
                .openInputStream(uri), null, options);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), e.toString(),
                Toast.LENGTH_LONG).show();
    }

    return bm;
}

public int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        } else {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
    }
    return inSampleSize;
}
7
Murali Ganesan

Je pense que la ligne suivante cause le problème.

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

Vous passez déjà le fichier uri comme suit

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);

Lorsque vous passez EXTRA_OUTPUT avec un URI, l'intention que vous recevez dans onActivityResult () sera nulle. Si vous souhaitez obtenir l'image dans cette méthode, récupérez l'image avec le chemin que vous passez avec EXTRA_OUTPUT.

6
Jose Jithin Stanly

Un code plus propre peut aider quelqu'un à la recherche d'une réponse, essentiellement lorsque vous enregistrez un fichier dans un ensemble de stockage externe, il n'y a plus de bitmap en résultat, au lieu de cela, vous devez charger à partir du fichier

String fileName;
.
. 
private void takePicture() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File

        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)        {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

       loadImageFromFile();
    }
}
public void loadImageFromFile(){

    ImageView view = (ImageView)this.findViewById(R.id.imageViewHeader);
    view.setVisibility(View.VISIBLE);


    int targetW = view.getWidth();
    int targetH = view.getHeight();

    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(fileName, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    // Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

    // Decode the image file into a Bitmap sized to fill the View
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(fileName, bmOptions);
    view.setImageBitmap(bitmap);
}
private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    fileName =  image.getAbsolutePath();
    return image;
}
4
vishal dharankar