2014-11-27 2 views
1

В настоящее время я разрабатываю приложение для фотоаппаратов, и у меня возникают некоторые проблемы: если вы заблокируете экран, а затем откройте его, изображение замерзает.Камера замерзает после разблокировки экрана

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

    //... 

    surfaceView = (SurfaceView) findViewById(id.surfaceView); 
    holder = surfaceView.getHolder(); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    holderCallback = new HolderCallback(); 
    holder.addCallback(holderCallback); 
} 
    @Override 
protected void onResume() { 
    super.onResume(); 
    camera = Camera.open(CAMERA_ID); 
} 

    @Override 
protected void onPause() { 
    super.onPause(); 
    if (camera != null) { 
     camera.setPreviewCallback(null); 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 
} 

(CameraOverlay() это класс, который расширяет SurfaceView и реализует SurfaceHolder.Callback. - от должности с подобной проблемой) я не использую CameraOverlay в любом месте, я должен создать его только для возобновления просмотра после разблокировки экрана.

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

+0

Можете ли вы опубликовать связанные с камерой звонки, которые находятся в вашем onCreate? –

+0

@AlexK, здесь, спасибо заранее – vkalit

ответ

1

Вот ваш другой вариант. onResume() будет вызываться каждый раз, когда приложение просматривается снова. Проблема в том, что вы устанавливаете обратный вызов предварительного просмотра на null в свой onPause(), а затем не фиксируете его в своем `onResume() '.

Так изменить ваш onResume() к этому:

@Override 
protected void onResume() { 
    super.onResume(); 
    camera = Camera.open(CAMERA_ID); 
    holder = surfaceView.getHolder(); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    holderCallback = new HolderCallback(); 
    holder.addCallback(holderCallback); 
} 

Это должно устранить проблему. Дайте мне знать, если это не так.

+0

Ты такой классный! Но это не сработало для меня :(Я не знаю, что случилось, ваш ответ выглядит таким изящным. – vkalit

+0

@vkalit Можете ли вы обновить код, чтобы показать мне, где вы инициализируете камеру в своем onCreate, пожалуйста? –

+0

Я не делал что я должен? – vkalit

1

В случае камеры, вся инициализация камеры должна выполняться в OnResume(), и она должна (SHOULD) быть деинициализирована и выпущена в onPause(). Еще когда ваше приложение переходит в фоновый режим, другие приложения не смогут получить экземпляр камеры.

Также есть множество вещей, чтобы сделать для инициализации Camera

1) безопасно открывать камеру 2) установка надлежащего предварительного просмотра и изображение размером 3), начиная с предварительного и инициализации обратных вызовов

Пожалуйста, смотрите в примере приложения я загрузил в GitHub и использовать его в качестве ссылки https://github.com/shrishmv/CameraTest

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

С уважением, Shrish

+0

Уважаемый @Shrish, спасибо за ваши отзывы, но проблема в том, что я делаю не просто, а самая простая камера, которая снимает только квадратные фотографии, и это работает. Единственное, что неправильно, это то, что она замерзает после разблокировки экрана. Если я использую ваш метод, мне придется развить весь нг с нуля. Не могли бы вы помочь в моей конкретной ситуации? Как мне изменить методы onCreate, onResume или onPause, чтобы устранить проблему? – vkalit

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