2010-01-07 39 views
1

全部,我一遍又一遍地搜索,找到一個解決方案,同時我發現了一個關於相機發布等問題,我不能爲我的生活似乎得到凸輪代碼上班。每次執行takePicture時,系統都會掛起,有時會調用PictureCallback,但大多數情況下它只是掛起。Android Moto Droid相機每次掛在相機上圖片

有關無法讀取/data/ap_gain.bin文件,奇怪的問題等

下面是代碼:

public class CameraActivity extends Activity implements Camera.PictureCallback, RequestConstants { 

private static final String TAG = "Camera"; 

private Preview preview; 

private boolean previewRunning; 

private int addressNotificationId; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    addressNotificationId = getIntent().getIntExtra(REQ_RA_ID, 0); 

    getWindow().setFormat(PixelFormat.TRANSLUCENT); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    if (preview == null) { 
    preview = new Preview(this); 
    } 
    setContentView(preview); 
} 

@Override 
protected void onDestroy() { 
    if (isFinishing()) { 
    preview.cleanup(); 
    } 

    super.onDestroy(); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_CAMERA) { 

    /* 
    preview.setDrawingCacheEnabled(true); 
    Bitmap ss = preview.getDrawingCache(); 
    byte[] data = ImageUtility.getImageData(ss,75,1); 
    Log.v(TAG, "Pic with size: " + data.length); 

    ApplicationManager.getInstance().createPacketRecord(PacketConstants.PT_FLAG_ADDRESS_PHOTO, ApplicationDatabaseManager.getInstance().getRouteAddressBySystemId(addressNotificationId), data); 
    finish(); 
    */ 
    preview.getCamera().takePicture(new Camera.ShutterCallback() { 
    @Override 
    public void onShutter() { 

    } 
    }, null, this); 
    return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    /* 
    if (data == null || isFinishing()) 
    return; 

    camera.stopPreview(); 
    previewRunning = false; 
    camera.release(); 
    */ 
    //Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,data.length); 
    //data = null; 
    //data = ImageUtility.getImageData(bitmap, 75,1); 

    Log.v(TAG, "Pic with size: " + data.length); 


    ApplicationManager.getInstance().createPacketRecord(PacketConstants.PT_FLAG_ADDRESS_PHOTO, ApplicationDatabaseManager.getInstance().getRouteAddressBySystemId(addressNotificationId), data); 
    finish(); 
} 

} 

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
    SurfaceHolder mHolder; 
    Camera mCamera; 

    Preview(Context context) { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 

     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    Camera getCamera() { 
    return mCamera; 
    } 

    void cleanup() { 
    mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     if (mCamera == null) 
     mCamera = Camera.open(); 

     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 

    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     parameters.setPictureSize(w, h); 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 

} 
+0

我與Nexus One有同樣的問題。我聽到快門聲,然後什麼都沒有。在調試日誌中,我看到「AudoHardware pcm播放將進入待機狀態」。你有什麼進展? – 2010-02-08 06:48:54

回答

0

你之後JpegPictureCallback被調用時,你需要調用mCamera再次啓動預覽。

API Camera示例中沒有足夠的信息來真正編寫相機應用程序,但您可以在此處獲取Google自己的相機應用程序的源代碼。 Camera.java包含了很多重要的,有用的代碼:

的git://android.git.kernel.org/platform/packages/apps/Camera.git

1

你有時拍照,有時不,因爲您在發生回調之前釋放相機。

當回調確實觸發時,取決於相機是否已經釋放,它將會或將無法訪問拍攝的照片。

我建議您確保在拍照時不釋放相機或關閉表格。

更好的是,從照片回調中關閉窗體。

此外,拍攝照片時,android的默認操作是停止預覽。這不是一個錯誤,而是預期的本質。