android中的自定义相机

时间:2012-01-23 09:25:57

标签: android camera

在我的应用程序中,我需要使用自定义相机。屏幕上有两个按钮" Keep Image"和"重拍照片"。当我点击"保留图像"时,凸轮拍摄的照片应保存在指定的目录中。按钮。当我点击"重拍照片"按钮凸轮应准备好拍摄新照片。我搜索了同样的东西,我得到了一个堆栈溢出链接,我试图在我的应用程序中实现它,但问题是拍摄照片和保存图片的所有代码都写在同一个类中。即使没有点击按钮,拍摄的照片也会自动保存。我想改变这一点。我尝试了不同的方法,但抛出错误。

请帮助我......以下是我的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 :(得分:0)

如果要构建现有代码,只需在用户选择重新拍摄其他图像时删除已保存的图像。