Проблема с запуском камеры Android Studio

393
21 декабря 2018, 03:50

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

final int CAMERA_ID = 0;
final int REQUEST_CODE_PERMISSION_READ_CONTACTS = 1;
SurfaceView surfaceView;
SurfaceHolder holder;
Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_camera);
    surfaceView = findViewById(R.id.cameraView);
}
@Override
protected void onResume()
{
    super.onResume();
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
    {
        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA},
                REQUEST_CODE_PERMISSION_READ_CONTACTS);
    }
    else
    {
        startCamera();
    }
}
@Override
protected void onPause() {
    super.onPause();
    if (camera != null)
        camera.release();
    camera = null;
}
@Override
public void onStop()
{
    super.onStop();
    if (camera != null)
    {
        camera.release();
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode)
    {
        case REQUEST_CODE_PERMISSION_READ_CONTACTS:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                Toast.makeText(this, R.string.premission, Toast.LENGTH_LONG).show();
            }
            else
            {
                Toast.makeText(this, R.string.not_premission, Toast.LENGTH_LONG).show();
            }
    }
    return;
}
private void startCamera()
{
    holder = surfaceView.getHolder();
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
    try {
        camera = Camera.open(CAMERA_ID);
        camera.setPreviewDisplay(holder);
        camera.startPreview();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
                           int height)
{
    camera.stopPreview();
    setCameraDisplayOrientation(CAMERA_ID);
    try {
        camera.setPreviewDisplay(holder);
        camera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
void setCameraDisplayOrientation(int cameraId) {
    // определяем насколько повернут экран от нормального положения
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    int degrees = 0;
    switch (rotation) {
        case Surface.ROTATION_0:
            degrees = 0;
            break;
        case Surface.ROTATION_90:
            degrees = 90;
            break;
        case Surface.ROTATION_180:
            degrees = 180;
            break;
        case Surface.ROTATION_270:
            degrees = 270;
            break;
    }
    int result = 0;
    // получаем инфо по камере cameraId
    Camera.CameraInfo info = new Camera.CameraInfo();
    Camera.getCameraInfo(cameraId, info);
    result = ((360 - degrees) + info.orientation);
    result = result % 360;
    camera.setDisplayOrientation(result);
}
Answer 1

После подтверждения или отклонения запроса на разрешение вызывается метод onRequestPermissionsResult - в нём Вы должны проверить, что разрешение получено и продолжить задачу:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode)
    {
        case REQUEST_CODE_PERMISSION_READ_CONTACTS:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                // разрешение получено, можно работать
                startCamera();
            }
            else
            {
                Toast.makeText(this, R.string.not_premission, Toast.LENGTH_LONG).show();
            }
    }
    return;
}
READ ALSO
В чем ошибка в программе вычисления выражений? Вместо результата выводит nan

В чем ошибка в программе вычисления выражений? Вместо результата выводит nan

Нужно сделать программу, которая выводит результат вычисления выражения в консольПроблема в том, что результат выводится корректно, если...

170
Преобразование типа фрагмента

Преобразование типа фрагмента

имеется следующий вопросУчу андроид программирование по книге, и там встретил следующий код:

171
Hibernate — почему не работает кэш первого уровня?

Hibernate — почему не работает кэш первого уровня?

Из статьи на хабре: Кеш первого уровня всегда привязан к объекту сессииHibernate всегда по умолчанию использует этот кеш и его нельзя отключить

157
Как не выгружать из памяти неактивные Fragment?

Как не выгружать из памяти неактивные Fragment?

Часть из MainActivity для загрузки Fragment's:

179