2013-12-10 58 views
3
public class AndroidCamera extends Activity implements OnTouchListener, SurfaceHolder.Callback{ 

Camera camera; 
SurfaceView surfaceView; 
SurfaceHolder surfaceHolder; 
boolean previewing = false;; 
PictureCallback rawCallback; 
ShutterCallback shutterCallback; 
PictureCallback jpegCallback; 



EditText txtData, Info,Age; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button buttonStartCameraPreview = (Button)findViewById(R.id.startcamerapreview); 
    Button buttonStopCameraPreview = (Button)findViewById(R.id.stopcamerapreview); 
    Button buttonCapturePreview = (Button) findViewById(R.id.capturepreview); 



    txtData = (EditText) findViewById(R.id.editText1); 
    Info = (EditText) findViewById(R.id.Name); 
    Info.setHint("enter name"); 
    Age = (EditText) findViewById(R.id.Age); 
    Age.setHint("Age"); 



    getWindow().setFormat(PixelFormat.UNKNOWN); 
    surfaceView = (SurfaceView)findViewById(R.id.surfaceview); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 




    rawCallback = new PictureCallback() 
    { 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 
      Log.d("Log", "onPictureTaken - raw"); 
     } 
    }; 

    shutterCallback = new ShutterCallback() 
    { 
     public void onShutter() { 
      Log.i("Log", "onShutter'd"); 
     } 
    }; 

    // onTouchEvent(null); 

    jpegCallback = new PictureCallback() 
    { 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 

      Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Asw"); 
      imagesFolder.mkdirs(); 
      Date d = new Date(); 
      CharSequence s = DateFormat.format("MM-dd-yy hh-mm-ss", d.getTime()); 
      File output = new File(imagesFolder, s.toString() + ".jpg"); 

      Uri uriSavedImage = Uri.fromFile(output); 
      imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 
      OutputStream imageFileOS; 

      try { 
       imageFileOS = getContentResolver().openOutputStream(uriSavedImage); 
       imageFileOS.write(data); 
       imageFileOS.flush(); 
       imageFileOS.close(); 

       Toast.makeText(AndroidCamera.this, 
         "Image saved: ", 
         Toast.LENGTH_LONG).show(); 

       } 
      catch (FileNotFoundException e) 
       { 
       e.printStackTrace(); 
       } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      finally 
      {} 
      Log.d("Log", "onPictureTaken - jpeg"); 
     } 
    }; 

    buttonStartCameraPreview.setOnClickListener(new Button.OnClickListener() 
    { 

     @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
     @Override 
     public void onClick(View v) 
     { 
      if(!previewing) 
      { 
       camera = Camera.open(0); 
       if (camera != null) 
       { 

        try { 

         camera.setPreviewDisplay(surfaceHolder); 
         camera.startPreview(); 
         previewing = true; 
         } 
        catch (IOException e) 
         { 

         e.printStackTrace(); 
         } 
       }else txtData.setText("null"); 
      } 
     }}); 



    buttonCapturePreview.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 

      captureImage(); 
     } 

     private void captureImage() 
     { 
      camera.takePicture(shutterCallback, rawCallback, jpegCallback); 

     } 
    }); 
    buttonStopCameraPreview.setOnClickListener(new Button.OnClickListener(){ 

     @Override 
     public void onClick(View v) 
     { 

      if(camera != null && previewing) 
      { 
       camera.stopPreview(); 
       camera.release(); 
       camera = null; 

       previewing = false; 
      } 
     }}); 




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


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) 
{ 
    // TODO Auto-generated method stub 

} 


@Override 
public void surfaceCreated(SurfaceHolder holder) 
{ 
    // TODO Auto-generated method stub 

} 


@Override 
public void surfaceDestroyed(SurfaceHolder holder) 
{ 
    // TODO Auto-generated method stub 

} 




public boolean onTouch(View v, MotionEvent event) 
{ 

    if (event.getAction() == MotionEvent.ACTION_MOVE) 
    { 
    camera.takePicture(shutterCallback, rawCallback, jpegCallback); 

    } 
    return super.onTouchEvent(event); 

    //return false; 
} 

我已經使用了一個按鈕來捕捉圖像。現在我想通過觸摸表面視圖來捕捉和保存圖像。我寫了一些代碼。它沒有顯示任何錯誤,但它也沒有工作。你能告訴我我哪裏錯了嗎?請幫助如何在表面視圖上觸摸捕捉圖像

回答

1

試試這個採取截屏編程...

// image naming and path to include sd card appending name you choose for file 
String mPath = Environment.getExternalStorageDirectory().toString() + "/" + ACCUWX.IMAGE_APPEND; 

// create bitmap screen capture 
Bitmap bitmap; 
View v1 = mCurrentUrlMask.getRootView(); 
v1.setDrawingCacheEnabled(true); 
bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
v1.setDrawingCacheEnabled(false); 

OutputStream fout = null; 
imageFile = new File(mPath); 

try { 
    fout = new FileOutputStream(imageFile); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout); 
    fout.flush(); 
    fout.close(); 

} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
+0

感謝您的幫助,但我不希望以編程方式做到這一點。我需要拍照時,當我觸摸屏幕...任何建議請 – Aswathy

+0

onTouch你可以調用此方法.. –

+0

我想我做到了這一點....但有些事情是失蹤....請你驗證我的代碼 – Aswathy

1
public class SnapShot extends Activity implements OnClickListener, 
     SurfaceHolder.Callback, Camera.PictureCallback { 

    SurfaceView cameraView; 
    SurfaceHolder surfaceHolder; 
    Camera camera; 
    LayoutInflater inflater; 
    Uri imageFileUri; 
    Button save; 
    Button retry; 
    View viewControl; 
    LayoutParams layoutParamsControl; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.view_camera); 

     cameraView = (SurfaceView) this.findViewById(R.id.CameraView); 
     surfaceHolder = cameraView.getHolder(); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     surfaceHolder.addCallback(this); 

     cameraView.setFocusable(true); 
     cameraView.setFocusableInTouchMode(true); 
     cameraView.setClickable(true); 
     cameraView.setOnClickListener(this); 

     inflater = LayoutInflater.from(getBaseContext()); 
     viewControl = inflater.inflate(R.layout.camera_control, null); 
     save = (Button) viewControl.findViewById(R.id.vc_btn_keep); 
     retry = (Button)viewControl.findViewById(R.id.vc_btn_discard); 
     layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 



    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     camera.startPreview(); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     camera = Camera.open(); 
     try { 
      Camera.Parameters parameters = camera.getParameters(); 
      if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { 
       // This is an undocumented although widely known feature 
       parameters.set("orientation", "portrait"); 
       // For Android 2.2 and above 
       camera.setDisplayOrientation(90); 
       // Uncomment for Android 2.0 and above 
       // parameters.setRotation(90); 
      } else { 
       // This is an undocumented although widely known feature 
       parameters.set("orientation", "landscape"); 
       // For Android 2.2 and above 
       camera.setDisplayOrientation(0); 
       // Uncomment for Android 2.0 and above 
       // parameters.setRotation(0); 
      } 
      camera.setParameters(parameters); 
      camera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
      camera.release(); 
      Log.v("surfaceCreated", exception.getMessage()); 
     } 
     camera.startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 

     camera.stopPreview(); 
     camera.release(); 
    } 

    @Override 
    public void onPictureTaken(final byte[] data, Camera camera) { 


     this.addContentView(viewControl, layoutParamsControl); 



      save.setOnClickListener(new Button.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        insertImage(data); 
        Intent i = new Intent(); 
        i.putExtra("data", imageFileUri.toString()); 
        setResult(-1, i); 
        finish(); 
       }}); 


     retry.setOnClickListener(new Button.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       finish(); 
      }}); 


    } 

    public void insertImage(byte[] data) 
    { 

     Bitmap b = null; 
     try { 
      b = GeneralUtils.decodeFile(data, this); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     b.compress(Bitmap.CompressFormat.JPEG, 80, bos); 
     //b = null; 
     Bitmap bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size()); 
     Matrix m = new Matrix(); 
     if (b.getWidth() > b.getHeight()) 
     { 
      m.postRotate(90); 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); 

     } 
     String result = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "", ""); 
     b.recycle(); 
     data = null; 
     b = null; 
     m = null; 

     imageFileUri = Uri.parse(result); 

    } 


    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     camera.takePicture(null, null, null, this); 
    } 

} 
+0

感謝您的幫助......但我認爲這個代碼捕捉圖像,當你點擊按鈕,而不是ontouch ...我想捕捉觸摸surfaceview ...任何建議 – Aswathy

+0

沒有..它在表面觸摸事件。只是試試這個.. – Riser

+0

@Erick - 嗨,請告訴我什麼'GeneralUtils.decodeFile(data,this);'是?我從哪裏得到它?謝謝 –

相關問題