2012-05-01 6 views
0

Je suis nouveau sur Android J'ai écrit un petit programme pour prendre des photos et les enregistrer dans le disque de mémoire interne. Mon programme est lancé avec succès, mais lorsque je prends des photos, aucune donnée n'est écrite sur le disque mémoire.Programme appareil photo Android

Voici mon code. Qu'est-ce que je rate?

package com.lab2; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.AutoFocusCallback; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import android.os.Environment; 

public class Lab2_cameraActivity extends Activity implements SurfaceHolder.Callback { 
/** Called when the activity is first created. */ 
private Camera mCamera; 
private SurfaceHolder mHolder; 
private SurfaceView mSurfaceView; 
private Button mbutton1; 
private ShutterCallback shutter; 
private PictureCallback raw; 
private PictureCallback postview; 



AutoFocusCallback AFCallback = new AutoFocusCallback(){ 
    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
     // TODO Auto-generated method stub 
     if (success){    
      mCamera.takePicture(shutter, raw, postview, jpeg);//take photo 
     }else{ 
      Toast.makeText(Lab2_cameraActivity.this, "in else...",Toast.LENGTH_LONG).show(); 
     } 
    } 
    }; 

    /*jpeg callback occurs when the compressed image is available*/ 
     PictureCallback jpeg = new PictureCallback(){ 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 
       // TODO Auto-generated method stub 
       FileOutputStream outStream = null;           
       File file = new File("/mnt/sdcard/");    
       try {      
        outStream = new FileOutputStream(file.toString()+"photo.jpg");            
        outStream.write(data);    
        outStream.close(); 
        Toast.makeText(Lab2_cameraActivity.this, "Photo Saved...",Toast.LENGTH_LONG).show();     
        mCamera.startPreview();    
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      }; 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     /*when surface destroyed, stop preview*/ 
     if(mCamera != null){ 
      mCamera.stopPreview(); 
      mCamera.release();//release camera resources 
      mCamera = null; 
     } 

     } 



public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    mCamera = Camera.open();//open camera 
    try { 
     mCamera.setPreviewDisplay(holder);//set surface to display 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    // TODO Auto-generated method stub 
    /*when surface changed, reset camera parameters for preview*/ 
    mCamera.getParameters();//get default parameters 
    Camera.Parameters parameters= mCamera.getParameters(); 
    /*you can set your own parameters in there*/ 
    mCamera.setParameters(parameters);//set parameters if parameters has been changed 
    mCamera.startPreview(); 
    } 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);  
    mbutton1 = (Button)findViewById(R.id.button1); 
    mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView); 
    mHolder = mSurfaceView.getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    mbutton1.setOnClickListener(new Button.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) { 
      mCamera.autoFocus(AFCallback); 
     } 
    }); 



} 

}

+0

avez-vous des autorisations pour écrire sur la carte SD? Voir mon autre poste pour plus d'infos: http://stackoverflow.com/questions/5453708/android-how-to-use-environment-getexternalstoragedirectory/5453753#5453753 – debracey

+0

J'ai vérifié votre message mais il n'y a rien sur la permission, je pense J'ai la permission d'écrire sur la carte SD. Aussi je ne lis pas une image stockée, je stocke une nouvelle photo prise par l'appareil photo – fanbondi

Répondre

1
  1. vous ne devriez pas préciser '/ mnt/whatever /' chemin de votre carte SD, utilisez getExternalFilesDir() pour obtenir le bon chemin.

  2. votre rappel n'est pas appelé, sauf si vous spécifiez dans mCamera.takePicture(null, null, jpeg);

  3. avez-vous vraiment

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> 
    

dans votre fichier AndroidManifest.xml?

+0

merci c'était le problème – fanbondi