Insérer une intention de sauvegarder une image

Je ne sais pas que je me trompe, tout semble aller bien, mais aucune photo n'est enregistrée dans le téléphone lorsque j'appuie sur la capture.

l'image du message a été sauvegardée, mais il n'y a rien sur ma galerie.

public class MirrorActivity extends Activity implements PictureCallback {
private final static String DEBUG_TAG = "MirrorActivity";
private Camera mCam;
private MirrorView mCamPreview;
private int mCameraId = 0;
private FrameLayout mPreviewLayout;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);



   //do we have a camera?
    if (!getPackageManager()
            .hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        Toast.makeText(this, "No camera feature on this device",
                Toast.LENGTH_LONG).show();
    } else {

        mCameraId = findFirstFrontFacingCamera();

        if (mCameraId >= 0) {
            mPreviewLayout = (FrameLayout) findViewById(R.id.camPreview);
            mPreviewLayout.removeAllViews();

            startCameraInLayout(mPreviewLayout, mCameraId);

            Button takePic = (Button) findViewById(R.id.capture);
            takePic.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    mCam.takePicture(null, null, MirrorActivity.this);

                }
            });
        } else {
            Toast.makeText(this, "No front facing camera found.",
                    Toast.LENGTH_LONG).show();
        }
    }
}


@SuppressLint("NewApi")
private int findFirstFrontFacingCamera() {
    int foundId = -1;
   //find the first front facing camera
    int numCams = Camera.getNumberOfCameras();
    for (int camId = 0; camId < numCams; camId++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(camId, info);
        if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
            Log.d(DEBUG_TAG, "Found back facing camera");
            foundId = camId;
            break;
        }
    }
    return foundId;
}

private void startCameraInLayout(FrameLayout layout, int cameraId) {

   //TODO pull this out of the UI thread.
    mCam = Camera.open(cameraId);
    if (mCam != null) {
        mCamPreview = new MirrorView(this, mCam);
        layout.addView(mCamPreview);
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (mCam == null && mPreviewLayout != null) {
        mPreviewLayout.removeAllViews();
        startCameraInLayout(mPreviewLayout, mCameraId);
    }
}

@Override
protected void onPause() {
    if (mCam != null) {
        mCam.release();
        mCam = null;
    }
    super.onPause();
}

public void onPictureTaken(byte[] data, Camera camera) {
    File pictureFileDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "SimpleSelfCam");

    if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {

        Log.d(DEBUG_TAG, "Can't create directory to save image");
        Toast.makeText(this, "Can't make path to save pic.",
                Toast.LENGTH_LONG).show();
        return;


    }

    String filename = pictureFileDir.getPath() + File.separator
            + "Picture.jpg";
    File pictureFile = new File(filename);

    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        fos.write(data);
        fos.close();
        Toast.makeText(this, "Image saved as Picture.jpg",
                Toast.LENGTH_LONG).show();
    } catch (Exception error) {
        Log.d(DEBUG_TAG, "File not saved: " + error.getMessage());
        Toast.makeText(this, "Can't save image.", Toast.LENGTH_LONG).show();

    }
}

public class MirrorView extends SurfaceView implements
        SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public MirrorView(Context context, Camera camera) {
        super(context);
        mCamera = camera;
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (Exception error) {
            Log.d(DEBUG_TAG,
                    "Error starting mPreviewLayout: " + error.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w,
            int h) {
        if (mHolder.getSurface() == null) {
            return;
        }

       //can't make changes while mPreviewLayout is active
        try {
            mCamera.stopPreview();
        } catch (Exception e) {

        }

        try {
           //set rotation to match device orientation
            setCameraDisplayOrientationAndSize();

           //start up the mPreviewLayout
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception error) {
            Log.d(DEBUG_TAG,
                    "Error starting mPreviewLayout: " + error.getMessage());
        }

    }

    public void setCameraDisplayOrientationAndSize() {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(mCameraId, info);
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int degrees = rotation * 90;

        /*
         *//the above is just a shorter way of doing this, but could break
         * if the values change switch (rotation) { case Surface.ROTATION_0:
         * degrees = 0; break; case Surface.ROTATION_90: degrees = 90;
         * break; case Surface.ROTATION_180: degrees = 180; break; case
         * Surface.ROTATION_270: degrees = 270; break; }
         */

        int result;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;
        } else {
            result = (info.orientation - degrees + 360) % 360;
        }
        mCamera.setDisplayOrientation(result);

        Camera.Size previewSize = mCam.getParameters().getPreviewSize();
        if (result == 90 || result == 270) {
           //swap - the physical camera itself doesn't rotate in relation
           //to the screen ;)
            mHolder.setFixedSize(previewSize.height, previewSize.width);
        } else {
            mHolder.setFixedSize(previewSize.width, previewSize.height);

        }
    }

}

Où devrais-je mettre ces lignes ??

        Intent intent =new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.fromFile(pictureFileDir));
        sendBroadcast(intent);
0
ajouté édité
Vues: 1
Je les mets à la fin de onPictureTaken, juste après le retour; maintenant la photo est sauvegardée .. je veux dire, ça crée quelque chose dans la galerie, mais c'est une icône, il n'y a pas d'image, c'est une icône avec une sorte de rayon dessus.
ajouté l'auteur user3001794, source
Oui! Ça a marché! Le seul problème restant est que la photo est prise, mais si je prends une deuxième photo, la seconde écrase la première. Cela ne se produit pas si je ferme et rouvre l'application .. devinez que quelque chose manque encore dans le code
ajouté l'auteur user3001794, source
Ces lignes sont nécessaires pour indiquer à MediaScanner qu'un nouveau fichier a été ajouté et doit être analysé. Il apparaîtra ensuite dans la galerie. Ajoutez-les après la sauvegarde de l'image, à la fin de onPictureTaken
ajouté l'auteur Ken Wolf, source
Essayez de le changer en intent.setData (Uri.fromFile (filename));
ajouté l'auteur Ken Wolf, source
J'ai répondu dans une réponse et vous a donné un conseil sur le problème secondaire que vous mentionnez ci-dessus. J'espère que cela t'aides.
ajouté l'auteur Ken Wolf, source
Veuillez considérer cette réponse comme acceptée, c'est important et voici pourquoi: meta.stackexchange.com/a/5235 Merci!
ajouté l'auteur Ken Wolf, source

1 Réponses

Modifier l'appel du scanner de support à partir de:

intent.setData(Uri.fromFile(pictureFileDir));

à:

intent.setData(Uri.fromFile(filename));

Dans le code d'origine, vous lui passez un répertoire - le correctif est de lui passer le nom de fichier réel.

En ce qui concerne votre commentaire sur l'image en cours de réécriture, cela est dû au fait que vous enregistrez constamment la dernière image en un seul nom de fichier.

String filename = pictureFileDir.getPath() + File.separator
        + "Picture.jpg";

Fix est bien sûr d'utiliser un nom de fichier unique à chaque fois (horodatage, ou simple compteur incrémentiel).

0
ajouté