camera app not working?

前端 未结 2 1946
小鲜肉
小鲜肉 2020-12-03 19:41

I got following stack trace

04-17 12:11:56.378: D/ATRecorder(10379): com.htc.autotest.dlib.RecordEngine in loader dalvik.system.DexClassLoader@40528b78
04-17         


        
相关标签:
2条回答
  • 2020-12-03 20:23

    You have to unlock the camera before creating MediaRecorder. And lock it before releasing it.

    Try this code, it will work Have fun...

    package com.marcodinacci.book.acb;
    
    import java.io.IOException;
    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.hardware.Camera;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.view.Surface;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ToggleButton;
    
    public class MediaRecorderRecipe extends Activity implements SurfaceHolder.Callback {
    
        private final String VIDEO_PATH_NAME = "/mnt/sdcard/VGA_30fps_512vbrate.mp4";
    
        private MediaRecorder mMediaRecorder;
        private Camera mCamera;
        private SurfaceView mSurfaceView;
        private SurfaceHolder mHolder;
        private View mToggleButton;
        private boolean mInitSuccesful;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.media_recorder_recipe);
    
            // we shall take the video in landscape orientation
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    
            mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
            mHolder = mSurfaceView.getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
            mToggleButton = (ToggleButton) findViewById(R.id.toggleRecordingButton);
            mToggleButton.setOnClickListener(new OnClickListener() {
                @Override
                // toggle video recording
                public void onClick(View v) {
                    if (((ToggleButton)v).isChecked()) {
                        mMediaRecorder.start();
                        try {
                            Thread.sleep(10 * 1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        finish();
                    }
                    else {
                        mMediaRecorder.stop();
                        mMediaRecorder.reset();
                        try {
                            initRecorder(mHolder.getSurface());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });     
        }
    
        /* Init the MediaRecorder, the order the methods are called is vital to
         * its correct functioning */
        private void initRecorder(Surface surface) throws IOException {
            // It is very important to unlock the camera before doing setCamera
            // or it will results in a black preview
            if(mCamera == null) {
                mCamera = Camera.open();
                mCamera.unlock();
            }
    
            if(mMediaRecorder == null)  mMediaRecorder = new MediaRecorder();
            mMediaRecorder.setPreviewDisplay(surface);
            mMediaRecorder.setCamera(mCamera);
    
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
           //       mMediaRecorder.setOutputFormat(8);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
            mMediaRecorder.setVideoFrameRate(30);
            mMediaRecorder.setVideoSize(640, 480);
            mMediaRecorder.setOutputFile(VIDEO_PATH_NAME);
    
            try {
                mMediaRecorder.prepare();
            } catch (IllegalStateException e) {
                // This is thrown if the previous calls are not called with the 
                // proper order
                e.printStackTrace();
            }
    
            mInitSuccesful = true;
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                if(!mInitSuccesful)
                    initRecorder(mHolder.getSurface());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            shutdown();
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
    
        private void shutdown() {
            // Release MediaRecorder and especially the Camera as it's a shared
            // object that can be used by other applications
            mMediaRecorder.reset();
            mMediaRecorder.release();
            mCamera.release();
    
            // once the objects have been released they can't be reused
            mMediaRecorder = null;
            mCamera = null;
        }
    
    }
    

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.marcodinacci.book.acb"
          android:versionCode="1"
          android:versionName="1.0">
    
         <uses-sdk android:minSdkVersion="7" />
         <uses-permission android:name="android.permission.CAMERA"/>
         <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
         <uses-permission android:name="android.permission.RECORD_AUDIO" />
         <uses-feature android:name="android.hardware.camera.autofocus" />
    
         <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name="MediaRecorderRecipe"
                  android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
         </application>
    </manifest>
    

    media_recorder_recipe.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <ToggleButton
             android:id="@+id/toggleRecordingButton"
             android:layout_width="fill_parent"
             android:textOff="Start Recording" 
             android:textOn="Stop Recording"
             android:layout_height="wrap_content"/>
    
        <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <SurfaceView android:id="@+id/surfaceView" 
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent"></SurfaceView>
        </FrameLayout>
    
    </LinearLayout>
    
    0 讨论(0)
  • 2020-12-03 20:35

    Have you given the permissions in the manifest?

    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name = "android.permission.RECORD_AUDIO"/>
    
    0 讨论(0)
提交回复
热议问题