2013-03-27 13 views
28

To jest mój kod I i chcę zapisać tę bitmapę w mojej pamięci wewnętrznej. Publiczny plik savelogu saveImageToInternalStorage jest kodem pochodzącym z google, ale nie wiem, jak go użyć. kiedy dotknę przycisku 2, wykonaj czynność przycisku 1.Jak zapisać bitmapę w pamięci wewnętrznej?

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

Odpowiedz

90

Aby zapisać bitmapę w sdcard użyć następującego kodu

Store Obraz

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

Aby uzyskać ścieżkę do przechowywania obrazów

/** 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 Od Twoje komentarze mam redakcją pogląd onclick w tej funkcji button1 i button2 będą realizowane oddzielnie.

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 i mImageName jak należy utworzyć? –

+0

edytowane sprawdź teraz marius – GoCrazy

+0

dziękuję bardzo, ale przycisk2 nadal śledzić przycisk1 fucntion –

0

Zmienić onClick() następująco:

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

Istnieje kilka sposobów, aby wymusić btn musi być wciśnięty przed btn1bitmap tak, że jest pomalowany zanim spróbujesz go zapisać.

I sugerują, że początkowo wyłączyć btn1 i że go włączyć gdy btn kliknięciu tak:

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

jak musi być widok z widokiem == if (BTN) i else if (zobacz == btn1)? –

+0

Edytowałem "widok" -> "v". Te dwie instrukcje 'if()' określają, który przycisk został naciśnięty wewnątrz funkcji '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(); 
    } 
} 
Powiązane problemy