2013-03-27 13 views
28

questo è il mio codice io e voglio salvare questa bitmap sulla mia memoria interna. Il booleano pubblico saveImageToInternalStorage è un codice di google ma non so come usarlo. quando tocco il pulsante 2 segui l'azione button1.Come salvare una bitmap nella memoria interna

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; 
    } 
    } 
} 

risposta

90

Per salvare la bitmap nella sdcard utilizzare il seguente codice

Image Store

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()); 
    } 
} 

Per ottenere il percorso per di memorizzazione delle immagini

/** 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; 
} 

EDIT dai vostri commenti ho curato la vista onclick in questo funzioni button1 e button2 verrà eseguito separatamente.

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; 
} 
} 
+0

capturedImage e mImageName come deve essere creato? –

+0

modificato controlla ora marius – GoCrazy

+0

grazie mille, ma il pulsante2 segue ancora la sequenza button1 –

0

Modifica onClick() come segue:

@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); 
    } 
} 

Ci sono diversi modi per far rispettare che btn deve essere premuto prima btn1 in modo che il bitmap è dipinta prima di tentare di salvarlo.

Suggerisco che inizialmente disattivare btn1, e che si attiva quando btn viene cliccato, in questo modo:

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

come deve essere vista da se (vista == BTN) e else if (vista == btn1)? –

+0

Ho modificato "vista" -> "v". Queste due istruzioni 'if()' determinano quale pulsante è stato premuto all'interno della funzione 'onClick()'. –

3
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(); 
    } 
} 
Problemi correlati