RuntimeException: Unable to resume activity

119
29 июня 2019, 22:00
    public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, View.OnClickListener,
            Camera.PictureCallback, Camera.PreviewCallback, Camera.AutoFocusCallback
    {
        private Camera camera;
        private SurfaceHolder surfaceHolder;
        private SurfaceView preview;
        private Button shotBtn;
        protected void onCreate(Bundle savedInstanceState, LayoutInflater inflater, ViewGroup container)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            preview = (SurfaceView) findViewById(R.id.SurfaceView01);
            surfaceHolder = preview.getHolder();
            surfaceHolder.addCallback(this);
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            shotBtn = (Button) findViewById(R.id.Button01);
            shotBtn.setText("Shot");
            shotBtn.setOnClickListener(this);
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder)
        {
            try
            {
                camera.setPreviewDisplay(holder);
                camera.setPreviewCallback(this);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            Camera.Size previewSize = camera.getParameters().getPreviewSize();
            float aspect = (float) previewSize.width / previewSize.height;
            int previewSurfaceWidth = preview.getWidth();
            int previewSurfaceHeight = preview.getHeight();
            ViewGroup.LayoutParams lp = preview.getLayoutParams();
            // здесь корректируем размер отображаемого preview, чтобы не было искажений
            if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
            {
                // портретный вид
                camera.setDisplayOrientation(90);
                lp.height = previewSurfaceHeight;
                lp.width = (int) (previewSurfaceHeight / aspect);
                ;
            }
            else
            {
                // ландшафтный
                camera.setDisplayOrientation(0);
                lp.width = previewSurfaceWidth;
                lp.height = (int) (previewSurfaceWidth / aspect);
            }
            preview.setLayoutParams(lp);
            camera.startPreview();
        }

        @Override
        protected void onResume()
        {
            super.onResume();
            camera = Camera.open();
        }
        @Override
        protected void onPause()
        {
            super.onPause();
            if (camera != null)
            {
                camera.setPreviewCallback(null);
                camera.stopPreview();
                camera.release();
                camera = null;
            }
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
        {
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder)
        {
        }
        @Override
        public void onClick(View v)
        {
            if (v == shotBtn)
            {
                // либо делаем снимок непосредственно здесь
                //  либо включаем обработчик автофокуса
                //camera.takePicture(null, null, null, this);
                camera.autoFocus(this);
            }
        }
        @Override
        public void onPictureTaken(byte[] paramArrayOfByte, Camera camera)
        {
            try
            {
                File saveDir = new File("/sdcard/CameraExample/");
                if (!saveDir.exists())
                {
                    saveDir.mkdirs();
                }
                FileOutputStream os = new FileOutputStream(String.format("/sdcard/CameraExample/%d.jpg", System.currentTimeMillis()));
                os.write(paramArrayOfByte);
                os.close();
            }
            catch (Exception e)
            {
            }
            // после того, как снимок сделан, показ превью отключается. необходимо включить его
            camera.startPreview();
        }
        @Override
        public void onPreviewFrame(byte[] data, Camera camera)
        {
        }
        @Override
        public void onAutoFocus(boolean success, Camera camera)
        {
            if (success)
            {
                // если удалось сфокусироваться, делаем снимок
                camera.takePicture(null, null, null, this);
            }
        }
    }

МАНИФЕСТ:


        <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapplication">
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    </manifest>




АКТИВИТИ:
        <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
        android:id="@+id/FrameLayout01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        xmlns:android="http://schemas.android.com/apk/res/android">
        <SurfaceView
            android:id="@+id/SurfaceView01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </SurfaceView>
        <Button
            android:id="@+id/Button01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@+id/Button01">
        </Button>
    </FrameLayout>
Answer 1

Проблема в том, что в onPause вы ставите camera = null;, а потом в onResume пытаетесь открыть camera = Camera.open(); Естественно, оно падает.

READ ALSO
Полиморфизм Java

Полиморфизм Java

Когда я переопределяю метод из базового класса с помощью @Override - это статическое связывание, а когда без - динамическоеПравильно ли я понимаю?

143
как сплитить list по ключевому символу

как сплитить list по ключевому символу

У меня есть файл, в котором лежит строка, где каждое значение разделено пробелом, мне надо разделить каждое значение через пробелВ файле строка...

117
JS чтение файла

JS чтение файла

У меня есть небольшое web-приложение с использованием JSОна лежит локально и должно точно так же использоваться локально

116
Drap and Drop До и после при перемещении стрелки

Drap and Drop До и после при перемещении стрелки

помогите осуществить такой механизмНашел вот такой пример jsfiddle

105