2016-09-12 9 views
0

Я создал приложение для Android, в котором я рисую на экране и нажимая кнопку. Он сохраняется в папке с картинками.Сохранение нового изображения на SD-карте вместо перезаписи

код:

MainActivity:

package com.example.writeonscreen; 

import android.support.v7.app.ActionBarActivity; 
import android.util.AttributeSet; 

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

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Bitmap.CompressFormat; 
import android.graphics.Bitmap.Config; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Toast; 


public class WriteOnScreenActivity extends ActionBarActivity { 
private String state; 
Bitmap bmp; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new TouchEventView(this,null)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.write_on_screen, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.savepic) { 
      state=Environment.getExternalStorageState(); 
      if(state.equals(Environment.MEDIA_MOUNTED)){ 


       String fileJPG = null; 
       final File path = 
          Environment.getExternalStoragePublicDirectory 
          (
           //Environment.DIRECTORY_PICTURES 
           //Environment.DIRECTORY_DCIM 
           Environment.DIRECTORY_DCIM + "/Utkarshpic/" 
          ); 

         // Make sure the Pictures directory exists. 
         if(!path.exists()) 
         { 
          path.mkdirs(); 
         } 

         final File file = new File(path, fileJPG + ".jpg"); 

         try 
         { 
          final FileOutputStream fos = new FileOutputStream(file); 
          final BufferedOutputStream bos = new BufferedOutputStream(fos, 8192); 

          //bmp.compress(CompressFormat.JPEG, 100, bos); 
          bmp.compress(CompressFormat.JPEG, 85, bos); 
Toast.makeText(getBaseContext(), "Picture saved in Utkarshpic", Toast.LENGTH_SHORT).show(); 
          bos.flush(); 
          bos.close(); 
         } 
         catch (final IOException e) 
         { 
          e.printStackTrace(); 
         } 



      }else{ 
       Toast.makeText(getBaseContext(), "Cannot Save Image.No SD Card !", Toast.LENGTH_LONG).show(); 
      } 

      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 



    public class TouchEventView extends View { 
     Paint paint=new Paint(); 
     Path path=new Path(); 
     Bitmap myBitmap; 
    public TouchEventView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      // TODO Auto-generated constructor stub 
      paint.setAntiAlias(true); 
      paint.setColor(Color.BLUE); 
      paint.setStrokeJoin(Paint.Join.ROUND); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeWidth(5); 
     } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.onDraw(canvas); 
     canvas.drawPath(path, paint); 
     myBitmap=Bitmap.createBitmap((int)canvas.getWidth(), (int)canvas.getHeight(), Config.ARGB_8888);// bitmap created 
     canvas=new Canvas(myBitmap); 

     canvas.drawARGB(255, 255, 255,255); 
     canvas.drawPath(path, paint); 
     pass(myBitmap); 

    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // TODO Auto-generated method stub 
     float xPos=event.getX(); 
     float yPos=event.getY(); 
     switch(event.getAction()){ 
     case MotionEvent.ACTION_DOWN: 
      path.moveTo(xPos, yPos); 
      return true; 
     case MotionEvent.ACTION_MOVE: 
      path.lineTo(xPos, yPos); 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
      default: 
       return false; 

     } 
     invalidate(); 

     return true; 


    } 


    } 



    public void pass(Bitmap myBitmap) { 
     // TODO Auto-generated method stub 
     bmp=myBitmap; 
    } 

} 

Теперь проблема заключается в том, что всякий раз, когда я создаю новый холст и сохранить его в SD-карты вместо того, чтобы создать новую картину с уникальным именем он перезаписывает ранее сохраненное изображение.

Что мне делать, чтобы добавить новое сохранение изображений с уникальным именем в моей папке?

ответ

2

Просто измените эту строку кода:

final File file = new File(path, fileJPG + ".jpg"); 

к этому:

final File file = new File(path, fileJPG + "_" + System.currentTimeMillis() + ".jpg"); 
1

для каждого нового изображения вам необходимо сохранить свое изображение с новым именем.

для примера: Append Отметка времени как:

final File file = new File(path, fileJPG + timestamp+".jpg"); 
-1

Вы должны использовать другое имя для вашего изображения, как

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); 
String timeStamp = dateFormat.format(new Date()); 
String imageFileName = "picture_" + timeStamp + ".jpg"; 
+0

'' java.util' ИЛИ java.sql'? –

+0

А как насчет 'api звонков 24 уровня'? Человек, на котором большинство телефонов не будет поддерживать точно! –

+0

Либо Вы можете использовать System.currentTimeInMillis или java.util.UUID.randomUUID() – iyu

1

или следующий код будет создающих случайное уникальное имя для файла, создаются:

public static String generateUniqueFileName() { 
     String filename = ""; 
     long millis = System.currentTimeMillis(); 
     String datetime = new Date().toGMTString(); 
     datetime = datetime.replace(" ", ""); 
     datetime = datetime.replace(":", ""); 
     String rndchars = RandomStringUtils.randomAlphanumeric(16); 
     filename = rndchars + "_" + datetime + "_" + millis; 
     return filename; 
    } 

Fun ction Использование:

fileJPG = generateUniqueFileName(); 

Happy Coding !!!

+0

слишком много коды! –