Кастомная камера в Android - PullRequest
0 голосов
/ 23 января 2012

В моем приложении мне нужно использовать пользовательскую камеру. На экране есть две кнопки «Сохранить изображение» и «Снять изображение». Снимок, сделанный камерой, должен быть сохранен в указанном каталоге, когда я нажимаю на кнопку «сохранить изображение». Когда я нажимаю на кнопку «Возврат фотографии», камера должна быть готова сделать новую фотографию. Я искал то же самое, и я получил ссылку переполнения стека, и я попытался реализовать это в своем приложении, но проблема в том, что весь код для фотосъемки и сохранения изображения написан в одном классе. Сделанный снимок будет автоматически сохранен даже без нажатия кнопки. Я хочу изменить это. Я пробовал разные способы, но выкидывал ошибки.

Пожалуйста, помогите мне ... ниже приведен мой код Java

public class CustomCameraDemo extends Activity {

private SurfaceView preview=null;   
private SurfaceHolder previewHolder=null;   
public Camera camera=null;    
private boolean inPreview=false;   
//ImageView image;   
Bitmap bmp,itembmp;  
static Bitmap mutableBitmap;   
PointF start = new PointF();   
PointF mid = new PointF();   
float oldDist = 1f;   
File imageFileName = null;   
File imageFileFolder = null;   
private MediaScannerConnection msConn;  
Display d;   int screenhgt,screenwdh;       
ProgressDialog dialog;
Button save;
Button retake;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
   // image=(ImageView)findViewById(R.id.image);  

    save=(Button)findViewById(R.id.Save);
    retake=(Button)findViewById(R.id.Retake);
    preview=(SurfaceView)findViewById(R.id.surface);     
    previewHolder=preview.getHolder();    
    previewHolder.addCallback(surfaceCallback);    
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    previewHolder.setFixedSize(getWindow().getWindowManager()     
            .getDefaultDisplay().getWidth(), getWindow().getWindowManager() 
            .getDefaultDisplay().getHeight()); 
    save.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {



        }
    });
    retake.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {


        }
    });

}

@Override   public void onResume() {  
    super.onResume();   
    camera=Camera.open(); 
    }  
@Override   public void onPause() {   
    if (inPreview) {  
        camera.stopPreview();   }   
    camera.release();   
    camera=null;   
    inPreview=false;   
    super.onPause();   
    }    

private Camera.Size getBestPreviewSize(int width, int height,Camera.Parameters parameters){   
    Camera.Size result=null;   
    for (Camera.Size size : parameters.getSupportedPreviewSizes()) 
    {   
        if (size.width<=width && size.height<=height)
        {
            if (result==null) {  
                result=size;   
            }   else {  
                int resultArea=result.width*result.height; 
                int newArea=size.width*size.height;  
                if (newArea>resultArea) {   
                    result=size;   
                    }  
                }   
            }   
        }   
    return(result);   
    }    
    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){

    public void surfaceCreated(SurfaceHolder holder) {     
        try {        
            camera.setPreviewDisplay(previewHolder); 
            }   catch (Throwable t) {   
                Log.e("PreviewDemo-surfaceCallback",
                        "Exception in setPreviewDisplay()", t);
                Toast.makeText(CustomCameraDemo.this, t.getMessage(), Toast.LENGTH_LONG).show();       
                }     
            }      
    public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) {
        Camera.Parameters parameters=camera.getParameters();       
        Camera.Size size=getBestPreviewSize(width, height,                                           
                parameters);       
        if (size!=null) {      
            parameters.setPreviewSize(size.width, size.height);
            camera.setParameters(parameters);       
            camera.startPreview();       
            inPreview=true;       
            }     
        }      
    public void surfaceDestroyed(SurfaceHolder holder) {

        }   
    };         

   Camera.PictureCallback photoCallback=new Camera.PictureCallback(){       

    public void onPictureTaken(final byte[] data, final Camera camera){      
                dialog=ProgressDialog.show(CustomCameraDemo.this,"","Saving Photo");       
                new Thread(){       
                    public void run(){       
                        try{      
                            Thread.sleep(1000);
                            }       
                        catch(Exception ex){}       
                        onPictureTake(data,camera);
                        }       
                    }.start();             
                    }       
            };          
    public void onPictureTake(byte[] data, Camera camera){        
                bmp = BitmapFactory.decodeByteArray(data, 0, data.length);       
                mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);       
                savePhoto(mutableBitmap);       
                dialog.dismiss();       
                }          
    class SavePhotoTask extends AsyncTask<byte[], String, String> {
                @Override       
                protected String doInBackground(byte[]... jpeg) {
                    File photo=new File(Environment.getExternalStorageDirectory(),"photo.jpg");
                    if (photo.exists()){
                        photo.delete();
                        }       try {      
                            FileOutputStream fos=new FileOutputStream(photo.getPath()); 
                            fos.write(jpeg[0]);       
                            fos.close();       
                            } catch (java.io.IOException e) {
                                Log.e("PictureDemo", "Exception in photoCallback", e);
                                }      
                            return(null);
                                }       
                }  
    public void savePhoto(Bitmap bmp) {
                imageFileFolder = new File(Environment.getExternalStorageDirectory(),"MyMedicalRecords");
                imageFileFolder.mkdir();
                FileOutputStream out = null; 
                Calendar c = Calendar.getInstance();
                String date = fromInt(c.get(Calendar.MONTH))+ fromInt(c.get(Calendar.DAY_OF_MONTH))
                + fromInt(c.get(Calendar.YEAR))             
                + fromInt(c.get(Calendar.HOUR_OF_DAY))            
                + fromInt(c.get(Calendar.MINUTE))           
                + fromInt(c.get(Calendar.SECOND)); 
                imageFileName = new File(imageFileFolder, date.toString() + ".jpg");
                try {  out = new FileOutputStream(imageFileName);  
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);  
                out.flush();  out.close();  
                scanPhoto(imageFileName.toString());  
                out = null; 
                } catch (Exception e) { e.printStackTrace(); } 
                }  
    public String fromInt(int val) {
                    return String.valueOf(val);
                    } 
    public void scanPhoto(final String imageFileName) {
                    msConn = new MediaScannerConnection(CustomCameraDemo.this,new MediaScannerConnectionClient() {
    public void onMediaScannerConnected() {
                            msConn.scanFile(imageFileName, null); 
                            Log.i("msClient obj  in Photo Utility","connection established"); 
                            } 
    public void onScanCompleted(String path, Uri uri) {
                                msConn.disconnect(); Log.i("msClient obj in Photo Utility","scan completed"); 
                                }
                            }); 
                    msConn.connect(); 
                    } 
                @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event){ if ( 
                        keyCode == KeyEvent.KEYCODE_MENU&& event.getRepeatCount() == 0) 
                { 
                    onBack(); 
                    } 
                return super.onKeyDown(keyCode, event); 
                }  
    public void onBack(){ Log.e("onBack :","yes"); 
                camera.takePicture(null,null,photoCallback); 
                inPreview=false; 
    } 


}

, приведенное ниже, является моим основным макетом

  <RelativeLayout   xmlns:android="http://schemas.android.com/apk/res/android"   
 android:layout_width="fill_parent"   
 android:layout_height="fill_parent">   
 <android.view.SurfaceView   
 android:id="@+id/surface"  
  android:layout_width="fill_parent"  
 android:layout_height="fill_parent"  
  />

 <Button android:layout_width="150dip" 
 android:layout_height="wrap_content" 
 android:layout_alignParentBottom="true" 
 android:text="Keep Photo" 
 android:id="@+id/Save"></Button>
 <TextView android:layout_below="@+id/surface" 
 android:layout_width="wrap_content" 
 android:id="@+id/textView1"
  android:layout_height="wrap_content"
 android:text="" 
  android:layout_alignParentBottom="true"
 android:layout_centerHorizontal="true"></TextView>
<Button android:layout_width="150dip" 
   android:layout_height="wrap_content" 
  android:layout_alignParentBottom="true" 
  android:layout_toRightOf="@+id/textView1"
 android:text="Retake Photo" 
 android:id="@+id/Retake"></Button>  </RelativeLayout> 

1 Ответ

0 голосов
/ 31 декабря 2016

Если вы хотите построить поверх существующего кода, вы можете просто удалить сохраненное изображение, когда пользователь решит восстановить другое изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...