2012-04-11 10 views
0

MOTO XT910アンドロイド携帯電話のカメラに問題があります。私はカメラの(フレーム)バッファにアクセスしたいだけですが、 "onPreviewFrame"は決して呼び出されません。私のエミュレータでは、正常に動作します。事前にカメラonPreviewFrameがXT910で呼び出されない

おかげで、

私のコード以下の通りです:

public class Store extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback { 
static { 
    System.loadLibrary("hello-jni"); 
} 

public native void decode(Bitmap pTarget, byte[] pSource); 

private Camera mCamera; 
private byte[] mVideoSource; 
private Bitmap mBackBuffer; 
private Paint mPaint; 
private Size lSize; 
private static String TAG = Store.class.getCanonicalName(); 


public Store(Context context) { 
    super(context); 
    getHolder().addCallback(this); 
    setWillNotDraw(false); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mCamera = Camera.open(); 
     mCamera.setDisplayOrientation(0); 
     mCamera.setPreviewDisplay(null); 
     mCamera.setPreviewCallbackWithBuffer(this); 
     Log.d(TAG,"surfaceCreated ok"); 
    } catch (IOException eIOException) { 
     mCamera.release(); 
     mCamera = null; 
     Log.d(TAG,"surfaceCreated failed"); 
     throw new IllegalStateException(); 
    } 
} 

public void surfaceChanged(SurfaceHolder pHolder, int pFormat, int pWidth, int pHeight) { 
    Log.d(TAG,"surfaceChanged in"); 
    mCamera.stopPreview(); 
    lSize = findBestResolution(pWidth, pHeight);   
    invalidate();  
    PixelFormat lPixelFormat = new PixelFormat(); 
    PixelFormat.getPixelFormatInfo(mCamera.getParameters() 
      .getPreviewFormat(), lPixelFormat); 
    int lSourceSize = lSize.width * lSize.height * lPixelFormat.bitsPerPixel/8; 
    mVideoSource = new byte[lSourceSize]; 
    mBackBuffer = Bitmap.createBitmap(lSize.width, lSize.height,Bitmap.Config.ARGB_8888); 
    Camera.Parameters lParameters = mCamera.getParameters(); 
    lParameters.setPreviewSize(lSize.width, lSize.height); 
    lParameters.setPreviewFormat(PixelFormat.YCbCr_420_SP); 
    mCamera.setParameters(lParameters); 
    mCamera.addCallbackBuffer(mVideoSource); 
    mCamera.startPreview(); 
    Log.d(TAG,"surfaceChanged out"); 
} 

private Size findBestResolution(int pWidth, int pHeight) { 
    List<Size> lSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
    Size lSelectedSize = mCamera.new Size(0, 0); 
    for (Size lSize : lSizes) { 
     if ((lSize.width <= pWidth) && (lSize.height <= pHeight) 
       && (lSize.width >= lSelectedSize.width) 
       && (lSize.height >= lSelectedSize.height)) { 
      lSelectedSize = lSize; 
     } 
    } 
    if ((lSelectedSize.width == 0) || (lSelectedSize.height == 0)) { 
     lSelectedSize = lSizes.get(0); 
    } 
    return lSelectedSize; 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    if (mCamera != null) { 
     Log.d(TAG,"surfaceDestroyed"); 
     mCamera.stopPreview(); 
     mCamera.release(); 

     mCamera = null; 
     mVideoSource = null; 
     mBackBuffer = null; 
    } 
} 

public void onPreviewFrame(byte[] pData, Camera pCamera) { 
    Log.d(TAG,"onPreviewFrame"); 
    decode(mBackBuffer, pData); 
    invalidate(); 
} 

@Override 
protected void onDraw(Canvas pCanvas) { 
    Log.d(TAG,"onDraw in"); 
    if (mCamera != null) { 
     Paint paint = new Paint(); 
     paint.setColor(Color.YELLOW); 
     String text = String.format("%dx%d", lSize.width, lSize.height); 
     pCanvas.drawText(text, 10, 10, paint);   
     pCanvas.drawLine(0, 0, 100, 100, paint); 
     pCanvas.drawLine(20, 0, 0, 20, paint); 
     pCanvas.drawBitmap(mBackBuffer, 0, 0, mPaint); 

     mCamera.addCallbackBuffer(mVideoSource); 
     Log.d(TAG,"onDraw out"); 
    } 
} 

}

答えて

1

まず、私はあなたが例外を取得し、あなたが(ピクセルフォーマットを使用したカメラパラメータということはなかったと仮定します。 YCbCr_420_SP)がカメラでサポートされています。

問題を解決するには、mCamera.setPreviewDisplay(view)を追加する必要があります。サーフェスビューでnullではない 残念ながらAndroidの男に応じてプレビューが表面図なしで起動しないでください。

は残念ながら、あなたは事前3.0デバイスをターゲットにしている場合、それらを表示するには、SurfaceViewを持たずに、プレビューのフレームを取得する方法はありません。 3.0以降では、Camera#setPreviewTexture()メソッドを使用して、プレビューデータをGPUテクスチャに送信できます。 GPUでRGBデータの代わりにYUVデータを使用したいだけであっても、必須のUI要素なしでストリームできるようになります。 SurfaceTextureを完全に無視するだけです。

現在の方法を守ると、残念ながら多くのデバイスでアプリが正常に機能しないことがわかります。プレビューデータが送信される前にsetPreviewDisplay()またはsetPreviewTexture()を設定しなければならないというAPIの制限に従うものがいくつかあります。

は、ここでは完全なバグレポートを参照してください:私はこのバグの報告書で述べたよう http://code.google.com/p/android/issues/detail?id=28238

は、しかし、それは表面図なしで動作することができますが、しかし、保証はありません。

関連する問題