Странная проблема. Камера запускается, все хорошо, изображение транслируется на экран. Но если я в первый раз устанавливаю приложение, оно просит разрешение, я его подтверждаю, все ок, но изображение не появляется, а появляется оно только после того как я переоткрою приложение или сверну и разверну. Если запускать в режиме дебага и делать точку останова на вызове фанкции 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);
}
После подтверждения или отклонения запроса на разрешение вызывается метод 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно сделать программу, которая выводит результат вычисления выражения в консольПроблема в том, что результат выводится корректно, если...
имеется следующий вопросУчу андроид программирование по книге, и там встретил следующий код:
Из статьи на хабре: Кеш первого уровня всегда привязан к объекту сессииHibernate всегда по умолчанию использует этот кеш и его нельзя отключить