2012-01-03 46 views
7

ACTUALIZACIÓNAndroid Guardar imagen en la tarjeta SD

Agregado

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

al manifiesto todo funciona bien ahora.

Ok, así que tengo una aplicación que he comenzado a crear, que al final quiero poder tomar una foto, que luego te lleva a otra pantalla que te permite "Usar" o "Volver a tomar" el imagen.

Cuando se toma la imagen, debe guardarse en una nueva carpeta en la tarjeta SD (si la carpeta no está allí, entonces necesita crearla). Estuve todo esto funcionando hace un par de semanas, pero después de hacer algunas ediciones y cerrar el eclipse, parece que no puedo volver a funcionar.

La sección para esto es después de int imageNum = 0; he agregado imagesFolder.mkdirs(); que creo que es correcto crear una nueva carpeta pero incluso esto parece no estar funcionando ahora.

Ahora se acaba de capturar la imagen y no se crea la nueva carpeta o se guarda la imagen.

public class AndroidCamera extends Activity implements SurfaceHolder.Callback { 

Camera camera; 
SurfaceView surfaceView; 
SurfaceHolder surfaceHolder; 
boolean previewing = false; 
LayoutInflater controlInflater = null; 

final int RESULT_SAVEIMAGE = 0; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    getWindow().setFormat(PixelFormat.UNKNOWN); 
    surfaceView = (SurfaceView) findViewById(R.id.camerapreview); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    controlInflater = LayoutInflater.from(getBaseContext()); 
    View viewControl = controlInflater.inflate(R.layout.control, null); 
    LayoutParams layoutParamsControl = new LayoutParams(
      LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    this.addContentView(viewControl, layoutParamsControl); 

    Button buttonTakePicture = (Button) findViewById(R.id.takepicture); 
    buttonTakePicture.setOnClickListener(new Button.OnClickListener() { 

     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      camera.takePicture(myShutterCallback, myPictureCallback_RAW, 
        myPictureCallback_JPG); 

     } 
    }); 
} 

ShutterCallback myShutterCallback = new ShutterCallback() { 

    public void onShutter() { 
     // TODO Auto-generated method stub 

    } 
}; 

PictureCallback myPictureCallback_RAW = new PictureCallback() { 

    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 

    } 
}; 

PictureCallback myPictureCallback_JPG = new PictureCallback(){ 

    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 
     /*Bitmap bitmapPicture 
      = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); */ 


     int imageNum = 0; 
     Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     File imagesFolder = new File(Environment.getExternalStorageDirectory(), "BeatEmUp"); 
     imagesFolder.mkdirs(); 
     String fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
     File output = new File(imagesFolder, fileName); 
     while (output.exists()){ 
      imageNum++; 
      fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
      output = new File(imagesFolder, fileName); 
     } 
     Uri uriSavedImage = Uri.fromFile(output); 
     imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 


     OutputStream imageFileOS; 
     try { 
      imageFileOS = getContentResolver().openOutputStream(uriSavedImage); 
      imageFileOS.write(arg0); 
      imageFileOS.flush(); 
      imageFileOS.close(); 

      Toast.makeText(AndroidCamera.this, 
        "Image saved: ", 
        Toast.LENGTH_LONG).show(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     camera.startPreview(); 
    }}; 


public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 
    if (previewing) { 
     camera.stopPreview(); 
     previewing = false; 
    } 

    if (camera != null) { 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      previewing = true; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

    camera = Camera.open(); 
    try { 
     Camera.Parameters parameters = camera.getParameters(); 
     if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { 
      // This is an undocumented although widely known feature 
      parameters.set("orientation", "portrait"); 
      // For Android 2.2 and above 
      camera.setDisplayOrientation(90); 
      // Uncomment for Android 2.0 and above 
      parameters.setRotation(90); 
     } else { 
      // This is an undocumented although widely known feature 
      parameters.set("orientation", "landscape"); 
      // For Android 2.2 and above 
      camera.setDisplayOrientation(0); 
      // Uncomment for Android 2.0 and above 
      parameters.setRotation(0); 
     } 
     camera.setParameters(parameters); 
     camera.setPreviewDisplay(holder); 
    } catch (IOException exception) { 
     camera.release(); 

    } 
    camera.startPreview(); 

} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
    previewing = false; 
} 
} 
+2

¿Usted está consiguiendo cualquier tipo de error? ¿Su manifiesto enumera los permisos para escribir en la tarjeta SD? –

+0

Gracias tonto error al no agregar permisos en el manifiesto :) – Matt

+0

¿Desea agregar esto como la respuesta, entonces puedo aceptar, puede ayudar a otros usuarios. – Matt

Respuesta

8

Debe asegurarse de que las listas de manifiesto el permiso para escribir en la tarjeta SD:

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