2016-05-16 15 views
4

私はカスタムカメラアプリケーションを作成しています。これは、表面ビューを必要とし、表面ビューの内側でカメラを開く。 しかし、marshmallowで同じアプリケーションを実行しているとき、私はカメラの許可を与えるためにランタイム許可を使用しています。ダイアログが消えても黒い画面が表示され、カメラが開くことができなくなったら 私は、許可した後でもアクティビティを再度呼び出すことによっても試しましたが、動作していません。サーフェスビューで許可を与えた後にカメラが開かない

THANXです。

@Override 公共ボイドsurfaceChanged(SurfaceHolderホルダ、INTフォーマット、INT幅、int型の高さ){

if (preview) { 
     camera.stopFaceDetection(); 
     camera.stopPreview(); 
     preview = false; 
    } 

    if (camera != null) { 
     preview = true; 
     // Parameters 
     Parameters parameters = camera.getParameters(); 
     parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
     List<Camera.Size> sizeList = camera.getParameters().getSupportedPreviewSizes(); 
     bestSize = sizeList.get(0); 
     for (int i = 1; i < sizeList.size(); i++) { 
      if ((sizeList.get(i).width * sizeList.get(i).height) > 
        (bestSize.width * bestSize.height)) { 
       bestSize = sizeList.get(i); 
      } 
     } 
     parameters.setPictureSize(bestSize.width, bestSize.height); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
     camera.startFaceDetection(); 
     camera.setFaceDetectionListener(faceDetectionListener); 
} 
    } 
} 

@Override 公共ボイドsurfaceCreated(SurfaceHolderホルダ){

customsurfaceview(); 
} 

公衆void customsurfaceview(){

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
     Log.e("PLAYGROUND", "Permission is not granted, requesting"); 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 123); 
    } 
    Log.e("Entered Surace Created", "----------------"); 
} 

公共ボイドSetPreview_onSurface(){

if (camera == null) 
     return; 


    camera = Camera.open(); 
    try { 
     camera.setPreviewDisplay(surfaceView.getHolder()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.e("printStackTrace", "--" + e.getMessage()); 

    } 
    camera_button = (ImageView) findViewById(R.id.camera_button); 
    camera_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (capture_chek == 0) { 
       camera.cancelAutoFocus(); 
       camera.takePicture(shutterCallback, null, pictureCallback); 
       capture_chek = 1; 
      } 
     } 
    }); 

@Override ます。public void surfaceDestroyed(SurfaceHolderホルダー){

if (camera != null) { 
     camera.release(); 
     camera = null; 
     preview = false; 
    } 

} 
+1

あなたがまだ試したコードを表示します –

+0

私のコードをここに入れることができません。それは私にインデントエラーを与えているからです。 – Vijay

+0

私が言うことができるのは、アプリケーションを実行した後、実行時のアクセス権を求められます。それはレイアウトを示していますが、アプリケーションを閉じてもう一度起動すると動作します。どのように許可を許可した後に再度サーフェスを作成するか考えています。 – Vijay

答えて

0

私は同じ問題を抱えている、そして

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

    // grant permission 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA); 
     return; 
    } 

    // ***HERE*** is my error: if camera permission not granted all of below 
    // code will never call 

    try { 
     mCamera = Camera.open();//you can use open(int) to use different cameras 
    } catch (Exception e) { 
     Log.d("ERROR", "Failed to get camera: " + e.getMessage()); 
    } 

    // set preview 
    if (mCamera != null) { 
     mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data 
     FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view); 
     camera_view.addView(mCameraView);//add the SurfaceView to the layout 
    } 

    //btn to close the application 
    ImageButton imgClose = (ImageButton) findViewById(R.id.imgClose); 
    imgClose.setOnClickListener(this); 
} 

私の例を参照してください。私は関数を作成しますinitial()すべての初期コードをバインドする許可が再び呼び出しinitを与えられたとき

public class CameraActivity extends MediaPickerBaseActivity implements View.OnClickListener { 
    private static final int REQUEST_PERMISSION_CAMERA = 77; 
    private Camera mCamera; 
    private CameraView mCameraView; 

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

     setCancelFlag(); 

     // grant permission 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA); 
      return; 
     } 
     initial(); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     if (requestCode == REQUEST_PERMISSION_CAMERA) { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       initial(); 
      } else { 
       // TODO: 5/8/17 show permission denied 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
     } 
    } 

    /** 
    * set cancel state from bundle (default: true) 
    * 
    * @see #isCancelIntermediate 
    * @see #flagCancelIntermediate 
    */ 
    private void setCancelFlag() { 
     isCancelIntermediate = getIntent().getBooleanExtra(flagCancelIntermediate, true); 
    } 

    /** 
    * init view and camera 
    */ 
    private void initial() { 
     try { 
      mCamera = Camera.open();//you can use open(int) to use different cameras 
     } catch (Exception e) { 
      Log.d("ERROR", "Failed to get camera: " + e.getMessage()); 
     } 

     // set preview 
     if (mCamera != null) { 
      mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data 
      FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view); 
      camera_view.addView(mCameraView);//add the SurfaceView to the layout 
     } 

     //btn to close the application 
     ImageButton imgClose = (ImageButton) findViewById(R.id.imgClose); 
     imgClose.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v.getId() == R.id.imgClose) 
      cancel(); 
    } 

    @Override 
    public void cancel() { 
     finish(); 
    } 

    @Override 
    public void sendResult() { 

    } 
} 

これは役に立ちます。

関連する問題