2011-11-30 81 views
2

我開發一個應用程序,它獲取的圖像,每當服務器調用和圖像發送到服務器。這是我定義的CameraSurfaceView類中的一些代碼。如何拍照編程

private SurfaceHolder holder; 
private Camera camera;   
private Bitmap osb; 
public void takeImage(){ 
    Camera camera = this.getCamera(); 
    CameraSurfaceView.HandlePictureStorage c = this.new HandlePictureStorage(); 
    camera.takePicture(null, null, c); 
} 
public byte[] getImage(String type) {  
    if (osb==null) { 
     System.err.println("Camera.getImage: osb NULL"); 
     return null; 
    } 

    CompressFormat format = CompressFormat.JPEG; 
    if (type.equals("PNG")) { 
     format = CompressFormat.PNG; 
    } 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    try { 
     System.err.println("Camera.getImage: decoded"); 
     osb.compress(format, 100, out); 
     System.err.println("Camera.getImage: compressed"); 
     try { 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } finally { 
     //lock.unlock(); 
    } 

    byte[] bytes = out.toByteArray(); 
    return bytes; 
} 


public void saveImage(byte[] picture) { 
    System.err.println("saveImage"); 
    osb = BitmapFactory.decodeByteArray(picture, 0, picture.length); 
} 

和內部類HandlePictureStorage實現PictureCallBack

@Override 
public void onPictureTaken(byte[] picture, Camera camera) 
{      
    CameraSurfaceView.this.saveImage(picture); 
} 

當我打電話takeImage()然後getImage()從外功能,我期望上HandlePictureStorage類的onPictureTaken(byte[] picture, Camera camera)代碼將右後takeImage()被執行以保存圖像和getImage()之前,所以getImage()有數據檢索。


不幸的是,當我在logcat中看到,getImage()功能takeImage()onPictureTaken()前右運行。因此,很明顯,takeImage只能獲得空數據,因爲沒有照片被保存之前。 如果再次運行takeImage()getImage(),功能getImage()將返回先前拍攝的照片。

回答

0

相機應用程序在一個單獨的進程中運行,你的回調是在稍後的時間執行(比如,它列車自動對焦,閃光flasch,JPEG編碼 - 這需要時間),你無法控制的持續時間。所以,你必須改變控制流程。爲什麼不從圖片回調中調用getImage()?

+0

你說幫我這麼多。感謝康斯坦丁。我解決了這個問題,通過添加一個信號來檢查圖像是否保存,然後運行getImage()。 – user1033464

+0

不要忘記接受解決方案%)不需要semafor,因爲您可以通過回調調用saveImage(),並且在需要UI操作時,可以使用runOnUiThread() –

5
CameraProjectActivity.java ----> main activity 

    public class CameraProjectActivity extends Activity 
    { 
     public static ImageView image; 
     private Button btn_camera; 

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

      image = (ImageView) findViewById(R.id.image); 

      btn_camera = (Button) findViewById(R.id.btn_camera); 
      btn_camera.setOnClickListener(new View.OnClickListener() 
      { 

       @Override 
       public void onClick(View v) 
       { 
        Intent i = new Intent(CameraProjectActivity.this,CameraView.class); 
        startActivityForResult(i, 999); 
       } 

      }); 
     } 

     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent intent) 
     { 
      if(requestCode==999) 
      { 
       if(resultCode==585) 
       { 
        //Intent Works 
       } 
       else 
       { 
        alert("Picture not Captured!"); 
       } 
      } 
     } 

     private void alert(String string) 
     { 
      AlertDialog.Builder alert=new AlertDialog.Builder(CameraProjectActivity.this); 
      alert.setMessage(string); 
      alert.setTitle("Alert"); 
      alert.setNeutralButton("Ok",null); 
      alert.show(); 
     } 
    } 

    CameraView.java 

    public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener 
    { 
     private static final String TAG = "CameraTest"; 
     Camera mCamera; 
     boolean mPreviewRunning = false; 

     public void onCreate(Bundle icicle) 
     { 
      super.onCreate(icicle); 
      Log.e(TAG, "onCreate"); 

      getWindow().setFormat(PixelFormat.TRANSLUCENT); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      setContentView(R.layout.cameraview); 
      mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
      mSurfaceView.setOnClickListener(this); 
      mSurfaceHolder = mSurfaceView.getHolder(); 
      mSurfaceHolder.addCallback(this); 
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 

     @Override 
     protected void onRestoreInstanceState(Bundle savedInstanceState) 
     { 
      super.onRestoreInstanceState(savedInstanceState); 
     } 


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

      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 
       // TODO Auto-generated method stub 
       if (data != null) 
       { 
        //Intent mIntent = new Intent(); 
        //mIntent.putExtra("image",imageData); 

        mCamera.stopPreview(); 
        mPreviewRunning = false; 
        mCamera.release(); 

        try 
         { 
         BitmapFactory.Options opts = new BitmapFactory.Options(); 
         Bitmap bitmap= BitmapFactory.decodeByteArray(data, 0, data.length,opts); 
         bitmap = Bitmap.createScaledBitmap(bitmap, 480, 480, false); 
         CameraProjectActivity.image.setImageBitmap(bitmap); 
         } 
         catch(Exception e) 
         { 
          e.printStackTrace(); 
         } 
        //StoreByteImage(mContext, imageData, 50,"ImageName"); 
        //setResult(FOTO_MODE, mIntent); 
        setResult(585); 
        finish(); 
       }  
      } 
     }; 




     protected void onResume() 
     { 
      Log.e(TAG, "onResume"); 
      super.onResume(); 
     } 

     protected void onSaveInstanceState(Bundle outState) 
     { 
      super.onSaveInstanceState(outState); 
     } 

     protected void onStop() 
     { 
      Log.e(TAG, "onStop"); 
      super.onStop(); 
     } 

     public void surfaceCreated(SurfaceHolder holder) 
     { 
      Log.e(TAG, "surfaceCreated"); 
      mCamera = Camera.open(); 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
      Log.e(TAG, "surfaceChanged"); 

      // XXX stopPreview() will crash if preview is not running 
      if (mPreviewRunning) 
      { 
       mCamera.stopPreview(); 
      } 

      Camera.Parameters p = mCamera.getParameters(); 
      p.setPreviewSize(w, h); 
      mCamera.setParameters(p); 
      try 
      { 
       mCamera.setPreviewDisplay(holder); 
      } 
      catch (Exception e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      mCamera.startPreview(); 
      mPreviewRunning = true; 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      Log.e(TAG, "surfaceDestroyed"); 
      //mCamera.stopPreview(); 
      //mPreviewRunning = false; 
      //mCamera.release(); 
     } 

     private SurfaceView mSurfaceView; 
     private SurfaceHolder mSurfaceHolder; 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      mCamera.takePicture(null, mPictureCallback, mPictureCallback); 
     } 
    } 

    cameraview.xml 

    <?xml version="1.0" encoding="utf-8"?> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" android:layout_height="fill_parent" 
     android:orientation="vertical"> 
     <SurfaceView android:id="@+id/surface_camera" 
      android:layout_width="fill_parent" android:layout_height="10dip" 
      android:layout_weight="1">  
     </SurfaceView> 
    </LinearLayout> 

    main.xml 

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <Button android:id="@+id/btn_camera" 
      android:text="Take a Picture from Camera" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:gravity="center" 
      > 
      </Button> 
      <ImageView 
      android:layout_height="480px" 
      android:layout_width="480px" 
      android:scaleType="fitXY" 
      android:id="@+id/image" 
      android:src="@drawable/android" 
      /> 
    </LinearLayout> 

// Dont forgot to add the below code in AndroidManifest.xml 
// <uses-permission android:name="android.permission.CAMERA"></uses-permission> 
// <uses-feature android:name="android.hardware.camera" /> 
// <uses-feature android:name="android.hardware.camera.autofocus" /> 
+0

感謝您的支持。但上面的代碼與按鈕是我以前做的,我想要的是沒有拍攝按鈕在手機上。 – user1033464

+1

我在哪裏顯示的照片圖像..... – NagarjunaReddy

+0

裏面的活動,你從哪裏我叫SurfaceVIew意圖 –