Cómo guardar un bitmap en el almacenamiento interno

este es mi código I y quiero guardar este bitmap en mi almacenamiento interno. El booleano público saveImageToInternalStorage es un código de Google, pero no sé cómo usarlo. cuando toco el botón 2, sigo la acción del botón1.

public class MainActivity extends Activity implements OnClickListener { Button btn, btn1; SurfaceView sv; Bitmap bitmap; Canvas canvas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button)findViewById(R.id.button1); btn1=(Button)findViewById(R.id.button2); sv=(SurfaceView)findViewById(R.id.surfaceView1); btn.setOnClickListener(this); btn1.setOnClickListener(this); bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } @Override public void onClick(View v) { canvas=sv.getHolder().lockCanvas(); if(canvas==null) return; canvas.drawBitmap(bitmap, 100, 100, null); sv.getHolder().unlockCanvasAndPost(canvas); } public boolean saveImageToInternalStorage(Bitmap image) { try { // Use the compress method on the Bitmap object to write image to // the OutputStream FileOutputStream fos = openFileOutput("desiredFilename.png", Context.MODE_PRIVATE); // Writing the bitmap to the output stream image.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); return true; } catch (Exception e) { Log.e("saveToInternalStorage()", e.getMessage()); return false; } } } 

Para guardar su bitmap en una tarjeta SD, use el siguiente código

Almacenar Imagen

 private void storeImage(Bitmap image) { File pictureFile = getOutputMediaFile(); if (pictureFile == null) { Log.d(TAG, "Error creating media file, check storage permissions: ");// e.getMessage()); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); image.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.close(); } catch (FileNotFoundException e) { Log.d(TAG, "File not found: " + e.getMessage()); } catch (IOException e) { Log.d(TAG, "Error accessing file: " + e.getMessage()); } } 

Para obtener el camino para el almacenamiento de imágenes

 /** Create a File for saving an image or video */ private File getOutputMediaFile(){ // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/Android/data/" + getApplicationContext().getPackageName() + "/Files"); // This location works best if you want the created images to be shared // between applications and persist after your app has been uninstalled. // Create the storage directory if it does not exist if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date()); File mediaFile; String mImageName="MI_"+ timeStamp +".jpg"; mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); return mediaFile; } 

EDITAR De tus comentarios, he editado la vista onclick, en esto las funciones button1 y button2 se ejecutarán por separado.

 public onClick(View v){ switch(v.getId()){ case R.id.button1: //Your button 1 function break; case R.id. button2: //Your button 2 function break; } } 
 private static void SaveImage(Bitmap finalBitmap) { String root = Environment.getExternalStorageDirectory().getAbsolutePath(); File myDir = new File(root + "/saved_images"); myDir.mkdirs(); String fname = "Image-"+ o +".jpg"; File file = new File (myDir, fname); if (file.exists ()) file.delete (); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } 

Modifique onClick() siguiente manera:

 @Override public void onClick(View v) { if(v == btn) { canvas=sv.getHolder().lockCanvas(); if(canvas!=null) { canvas.drawBitmap(bitmap, 100, 100, null); sv.getHolder().unlockCanvasAndPost(canvas); } } else if(v == btn1) { saveBitmapToInternalStorage(bitmap); } } 

Hay varias formas de hacer cumplir que btn debe presionar antes de btn1 para que el bitmap se pinta antes de intentar guardarlo.

Sugiero que deshabilite inicialmente btn1 y que lo habilite cuando se btn clic en btn , como este:

 if(v == btn) { ... btn1.setEnabled(true); }