2016-05-10 6 views
-1

私はカメラのプレビュー機能を持つカメラアプリを持っています。このアプリケーションは数年前に開発され(2012年)、コードの一部を再利用することにしましたが、同じハードウェアi9100(別のOS 4.4 vs 3.0)で再度テストすると、カメラのプレビュー画像に問題が発生しますAndroidアプリのカメラのプレビューが機能しなくなりました(非推奨の `setType`メソッドを使用)

enter image description here

私は携帯電話を移動すると、私は画像の変化を参照して、それは明るく暗いパターン(したがって、アプリはカメラと通信している)に応答します。

これは(それがsetType非推奨メソッドを使用しています)私のコードです:

class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
private static final String TAG = "TGCamera"; 

SurfaceHolder mHolder; 
public Camera camera; 
public final String fileName = "/download/CameraGPS/zdelTempPhotoPreview.jpg"; 

CameraPreview(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); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    camera = Camera.open(); 
    Parameters parameter02 = camera.getParameters(); 
    parameter02.setJpegThumbnailSize(80, 60); 
    parameter02.setPictureSize(640, 480); 
    camera.setParameters(parameter02); 
    try { 
     camera.setPreviewDisplay(holder); 
     camera.setDisplayOrientation(90); 
     Parameters parameters00 = camera.getParameters(); 
     //parameters00.setRotation(90); 
     //parameters00.setFlashMode("on"); 
     //parameters00.setJpegQuality(20); 
     camera.setParameters(parameters00); 

     camera.setPreviewCallback(new PreviewCallback() { 

      public void onPreviewFrame(byte[] data, Camera arg1) { 
       CameraPreview.this.invalidate(); 
      } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    // Because the CameraDevice object is not a shared resource, it's very 
    // important to release it when the activity is paused. 
    camera.stopPreview(); 
    camera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 

    //camera.getParameters().setRotation(); 
    //camera.getParameters().setJpegQuality(20); 
    //camera.getParameters().setPictureSize(width, height) 

    Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(w, h); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

@Override 
public void draw(Canvas canvas) { 
    super.draw(canvas); 

    Log.w(TAG,"clicked in preview"); 
    Paint p = new Paint(Color.RED); 
    Log.d(TAG, "draw"); 
    canvas.drawText("PREVIEW", canvas.getWidth()/2, 
      canvas.getHeight()/2, p); 
} 

任意の提案ですか?

+1

画像サイズとプレビューサイズを任意の値に設定することはできません。それぞれgetSupportedPictureSizes()とgetSupportedPreviewSizes()によって返されるリストを確認してください。多くの場合(Samsung Galaxy S2に該当するかどうかはわかりませんが)、画像のアスペクト比とプレビューのアスペクト比が異なると、カメラが正しく動作しません。さらに、あなたはプレビューサーフェス上に描画することは想定されておらず、間違いなくonPreviewFrame()コールバックからではありません。 –

+1

回答として回答してください。あなたはIT @AlexCohnを釘付けにしました! –

答えて

2

ピクチャサイズとプレビューサイズを任意の値に設定することはできません。それぞれgetSupportedPictureSizes()とgetSupportedPreviewSizes()によって返されるリストを確認してください。

(これはSamsung Galaxy S2に該当するかどうか覚えていません)、画像のアスペクト比がプレビュー用のアスペクト比と異なる場合、カメラが正しく動作しません。

また、プレビューサーフェスに描画することは想定されておらず、onPreviewFrame()コールバックから描画することもできません。

+0

は 'onDraw'とピクチャサイズへの参照をすべて削除して動作します。 TKS! –

1

最初の事はあまりにもあなたsurfaceChanged()方法で

更新camera.setPreviewDisplay(holder)を追加することです:holder.getSurface() != nullは また、あなたがsurfaceDestroyedcamera.release()を追加する必要があり、その後、(最初のアンインストールアプリをクリーンインストールすることをsurfaceCreatedsurfaceChangedでデバッグしてください をアプリを新しくインストールしてください)。前回のアプリの実行以来、カメラサービスがハングアップしている可能性があります。

アップデート2: 私はちょうどあなたがsurfaceCreated()とsurfaceChanged()メソッドで渡さSurfaceHolderからのコールバックを登録逃したことに気づきました。この場合、それはsurfaceCreatedsurfaceChanged方法で...実際に呼び出されることはありません)surfaceChangedは()に達することはありませんし、それがstartPreviewを(意味

を理にかなって、含まれるようにコードを更新してください:

mHolder.removeCallback(this); // unregister from old SurfaceHolder 
    holder.addCallback(this); // register to new holder 
    try { 
     camera.setPreviewDisplay(holder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mHolder = holder; 
+0

残念ながら、少なくとも結果には影響しませんでした。しかし、努力4。他人の問題を解決するかもしれない。 :) –

+1

私はもっと根本的な原因に近づくのを助けることを望む、より多くのアイデアを更新しました –

+0

tks。はい、カメラをリリースすることは問題ではありませんでした。まだ根本的な問題を見つけようとしている。できるだけ早く戻ってきます。更新されました! –