Мое простое приложение камеры (Android) не загружает изображение с камеры после первой попытки

Я просто пытаюсь создать простое приложение камеры, которое использует разрешения во время выполнения... кажется, что оно загружается нормально при первом запуске приложения (запрашивая разрешение камеры). После разрешения доступа он работает... но как только я закрываю его и снова запускаю, он просто показывает белое изображение с моими значками, которые не отвечают. Я проверил разрешения вручную в приложении, и камера по-прежнему имеет доступ, но я думаю, что ошибаюсь в своем коде разрешений.

Вот код MainActivity:

public class MainActivity extends AppCompatActivity {

    private static final int MY_PERMISSIONS_REQUEST_CAMERA = 1;
    private Camera mCamera = null;
    private Camera mCameraFront = null;
    private CameraView mCameraView = null;
    public int switchCamera = 1;


//    int permissionCheck = ContextCompat.checkSelfPermission(this,
//            Manifest.permission.CAMERA);

//    String[] perms = {"android.permission.CAMERA"};


//    int permsRequestCode = 200;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {

            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.CAMERA)) {

                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            } else {

                // No explanation needed, we can request the permission.

                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.CAMERA},
                        MY_PERMISSIONS_REQUEST_CAMERA);

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

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

                //btn to close the application
                ImageButton imgClose = (ImageButton) findViewById(R.id.imgClose);
                imgClose.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        mCamera.setPreviewCallback(null);
                        mCamera.setErrorCallback(null);
                        mCamera.stopPreview();
                        mCamera.release();
                        mCamera = null;
                        System.exit(0);
                    }
                });

//                     btn to switch camera
                ImageButton imgSwitch = (ImageButton) findViewById(R.id.cameraSwitch);
                imgSwitch.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
//                            switchCamera++;
                    }
                });


            }
        }
    }



    public void SwapCamera() {
        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
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {

        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_CAMERA: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {



                    // permission was granted, yay! Do the
                    // camera-related task you need to do.

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

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

                    //btn to close the application
                    ImageButton imgClose = (ImageButton)findViewById(R.id.imgClose);
                    imgClose.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            mCamera.setPreviewCallback(null);
                            mCamera.setErrorCallback(null);
                            mCamera.stopPreview();
                            mCamera.release();
                            mCamera = null;
                            System.exit(0);
                        }
                    });

//                     btn to switch camera
                    ImageButton imgSwitch = (ImageButton)findViewById(R.id.cameraSwitch);
                    imgSwitch.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
//                            switchCamera++;
                       }
                    });



                } else {

                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request
        }
    }

    public void onActivityResult() {

    }


}

person fmi    schedule 10.11.2016    source источник


Ответы (2)


Я считаю, что вам не хватает «еще»

if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
// your code

} else {
   // stuff with camera
   try{
      mCamera = Camera.open(1);
   } catch (Exception e){
   ...
}
person innich    schedule 10.11.2016
comment
Я запутался, где мне не хватает другого... У меня есть блок try с методом onRequestPermissionsResult.... Должен ли я переместить его в метод onCreate? (в области if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) - person fmi; 10.11.2016
comment
Вы должны скопировать его в метод onCreate. @Влад Матвиенко объяснил. - person innich; 10.11.2016

Вы только запускаете персонал камеры в onActivityResult, который вызывается только тогда, когда у вас нет разрешений, и запрашиваете их:

if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
    ...
}

этому if требуется else в случае, когда разрешение уже PERMISSION_GRANTED. Вы должны сделать здесь тот же нотоносец, что и в onActivityResult:

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

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

                        //btn to close the application
                        ImageButton imgClose = (ImageButton)findViewById(R.id.imgClose);
                        imgClose.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                mCamera = null;
                                System.exit(0);
                            }
                        });

    //                     btn to switch camera
                        ImageButton imgSwitch = (ImageButton)findViewById(R.id.cameraSwitch);
                        imgSwitch.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
    //                            switchCamera++;
                           }
                        });
}
person Vladyslav Matviienko    schedule 10.11.2016
comment
Я скопировал блок try в оператор else (сразу за != в PERMISSION_GRANTED), но все равно получаю тот же результат... Думаю, я неправильно понимаю ваш ответ. - person fmi; 10.11.2016
comment
@fmi, у тебя есть исключения? - person Vladyslav Matviienko; 10.11.2016
comment
Нет.... когда я загружаю приложение в первый раз, оно предлагает мне запрос.... передняя камера затем отображается с двумя значками вверху.... после закрытия приложения и повторного открытия, я не получаю запрос больше, и я просто вижу белый экран с двумя значками вверху, которые больше не реагируют на прикосновения - person fmi; 10.11.2016
comment
Можете ли вы обновить код в своем вопросе, чтобы я мог что-то найти. - person Vladyslav Matviienko; 10.11.2016
comment
Я только что обновил код, но только что заметил, что получаю предупреждение... мой вызов addView может привести к исключению нулевого указателя... это в моем методе swapCamera() - person fmi; 10.11.2016