2016-05-16 5 views
4

Я делаю заказное приложение для камеры. который требует просмотра поверхности и открывает камеру внутри поверхности. Но при запуске того же приложения на зефире я использую разрешение во время выполнения разрешения на предоставление камеры. после того, как я разрешу, диалог исчезнет, ​​но появится черный экран, и камера не открывается. Я также попробовал, снова вызвав эту операцию, разрешив, но не работая.Камера не открывается после предоставления разрешения на вид поверхности

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 общественности недействительным 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(), чтобы связать весь код инициализации, когда разрешено разрешение на вызов снова.

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() { 

    } 
} 

надеюсь, что это поможет.

Смежные вопросы