2017-05-10 7 views
0

私はカメラアプリケーションに取り組んでいます。私はプレビューを表示するためにいくつかのコードを書くが、それは動作していない。エラーはありませんが、画面は常に黒です。私は何かが足りないと思う。ここにコードがあります。私はコードですAndroidでカメラプレビューを設定する

プレビュー

public class Preview extends SurfaceView implements SurfaceHolder.Callback { 

    private static final String TAG = "com.azeem.Debug"; 

    private Context context; 
    private SurfaceView mSurfaceView; 
    public Camera mCamera; 
    private static final Camera.CameraInfo mCameraInfo = new Camera.CameraInfo(); 
    private Display mDisplay; 
    private List<Camera.Size> mSupportedPreviewSizes; 
    Camera.Size mPreviewSize; 
    private static final int NO_CAMERA = -1; 
    private boolean mIsFrontCamera = false; 
    private boolean mIsFlashOn = false; 
    private int mFrontCameraId, mBackCameraId; 

    public Preview(Context ctx) { 
     super(ctx); 
     context = ctx; 
     Log.i(TAG, "First Constructor"); 
     init(); 
    } 

    public Preview(Context ctx, AttributeSet attrs) { 
     super(ctx, attrs); 
     context = ctx; 
     Log.i(TAG, "Second Constructor"); 
     init(); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     Log.i(TAG, "surfaceCreated"); 
     this.start(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     Log.i(TAG, "surfaceChanged"); 
     if(mPreviewSize != null) { 
      Log.i(TAG, "Activate Optimal Preview"); 
      Camera.Parameters parameters = mCamera.getParameters(); 
      parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.i(TAG, "surfaceDestroyed"); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     Log.i(TAG, "onMeasure"); 
     final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
     final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 
     setMeasuredDimension(width, height); 

     if (mSupportedPreviewSizes != null) { 
      mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); 
     } 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     Log.i(TAG, "onLayout"); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.i(TAG, "onTouchEvent"); 
     return super.onTouchEvent(event); 
    } 

    private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio=(double)h/w; 

     if (sizes == null) return null; 

     Camera.Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 

     for (Camera.Size size : sizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Camera.Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

    private void init(){ 
     Log.i(TAG, "init"); 
     if(hasCamera()) { 
      final SurfaceHolder surfaceHolder = this.getHolder(); 
      surfaceHolder.addCallback(this); 

      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) 
       surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

      mBackCameraId = findCameraId(false); 

      if(hasFrontCamera()){ 
       mFrontCameraId = findCameraId(true); 
      }else{ 
       mFrontCameraId = NO_CAMERA; // Front Face Camera Not found on device 
      } 

      final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
      mDisplay = windowManager.getDefaultDisplay(); 

     } // Else Camera not found on device 
    } 

    public void setCamera(){ 
     Log.i(TAG, "setCamera"); 
     //if(mSurfaceView != null && hasCamera()){ 
     if(hasCamera()){ 
      mCamera = Camera.open(mBackCameraId); 
     } 
    } 

    public void start(){ 
     Log.i(TAG, "start"); 
     if(mCamera != null){ 
      try { 
       mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
       //mCamera.setPreviewDisplay(mSurfaceView.getHolder()); 
       mCamera.setPreviewDisplay(this.getHolder()); 
       mCamera.startPreview(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void stop(){ 
     Log.i(TAG, "stop"); 
     if(mCamera != null){ 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    private boolean hasCamera() { 
     final PackageManager packageManager = context.getPackageManager(); 
     return packageManager != null 
       && packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA); 
    } 

    private boolean hasFrontCamera() { 
     final PackageManager packageManager = context.getPackageManager(); 
     return packageManager != null 
       && packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT); 
    } 

    private int findCameraId(boolean front) { 
     final int cameraCount = Camera.getNumberOfCameras(); 
     for (int i = 0; i < cameraCount; i++) { 
      Camera.getCameraInfo(i, mCameraInfo); 
      if ((front && mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) 
        || (!front && mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK)) { 
       return i; 
      } 
     } 
     return NO_CAMERA; 
    } 

} 

MainActivity

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     preview = new Preview(this); 


    capturePicture.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       preview.mCamera.takePicture(null, null, jpegCallback); 
      } 
     }); 
    }  
    @Override 
    protected void onResume() { 
     super.onResume(); 
     preview.setCamera(); 
     preview.start(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     preview.stop(); 
    }  
    // Other Code.... 
} 

activity_main.xml

<com.azeem.mycamera.Preview 
    android:id="@+id/surfaceView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<!-- Other Codes Buttons etc --> 

プレビューは表示されません。私が逃していることを教えてください。

更新

あり、私はすべての私setCamerapreview内部クラスuses-premissions

プレビュー作業を必要と言及マニフェストファイルでもありますが、私はMainActivityからそれを設定すると、それは働いていません。

ここにコードがあります。 プレビュークラス

// other code 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    Log.i(TAG, "surfaceCreated"); 
    this.setCamera(); 
    this.start(); 
} 
// other code 

MainActivity

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

}  
@Override 
protected void onResume() { 
    super.onResume(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
}  
// Other Code.... 

私はMainActivityからそれを設定するとき、私は「何の問題は何更新前にコードを示し、これが動作しているが、それは働いていませんあなたが私に知らせてくれますか?

+0

あなたは共有する必要があります質問のプレビューコード –

+0

@Javacoder私はすでに 'preview'クラスを共有していますそれは私が持っているすべてのコードです –

+0

sdkにサンプルアプリケーションがあるはずです。それを見つけ、コードと比較する必要があります。 –

答えて

0

あなたはAndroid Manifestでの許可を宣言しており、Android最新バージョンの使用に関するランタイムアクセス許可を確認しましたか?

+0

はい、私はアンドロイドで許可を宣言しました –

0

表面が作成されるまでプレビューを開始することはできません。したがって、あなたの作業コードでonSurfaceCreatedでカメラを起動するのが理にかなっているようです。もしあなたが本当にonResumeでこの動作を強制したいのであれば、おそらくできるのは、resumedとsurfaceCreatedという2つのフラグを維持することです。このような

何か(注:擬似コード)...

onResume(...){ 
    resumed = true; 
    if (surfaceCreated){ 
     startCam(); 
    } 
} 

onSurfaceCreated(){ 
    surfaceCreated = true; 
    if (resumed){ 
     startCam(); 
    } 
} 

onPause(){ 
    resumed = false; 
} 

onSurfaceDestroyed(){ 
    surfaceCreated = false; 
} 

これは、カメラを設定するとき、あなたのすべての条件が満たされていることを確認します。

関連する問題