1

我是 Android Things 领域的新手,我为 pico IMX7 刷新了 Android Things OS 映像并成功启动,一切都很好……直到我运行了一个 Github ( https://github.com/dozingcat/CamTimer ) 程序来验证相机。

1)当我运行程序时,我能够拍摄第一张照片,但是当我尝试拍摄第二张照片时,出现以下错误 ==>

01-01 05:36:36.395 3399-3399/com.dozingcatsoftware.cameratimer V/MediaPlayer: resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
01-01 05:36:36.395 3399-3399/com.dozingcatsoftware.cameratimer V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
01-01 05:36:37.415 3399-3399/com.dozingcatsoftware.cameratimer V/MediaPlayer: resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
01-01 05:36:37.415 3399-3399/com.dozingcatsoftware.cameratimer V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
01-01 05:36:38.410 3399-3399/com.dozingcatsoftware.cameratimer V/MediaPlayer: resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
01-01 05:36:38.410 3399-3399/com.dozingcatsoftware.cameratimer V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
01-01 05:36:48.175 3399-3399/com.dozingcatsoftware.cameratimer E/Camera: Error 1

然后应用程序因此错误而崩溃==>

05:41:23.712 5793-6317/com.dozingcatsoftware.cameratimer W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...  
01-01 05:41:23.712 5793-6317/com.dozingcatsoftware.cameratimer D/OpenGLRenderer: Swap behavior 0
01-01 05:41:23.712 5793-6317/com.dozingcatsoftware.cameratimer A/OpenGLRenderer: Failed to choose config, error = EGL_SUCCESS  
01-01 05:41:23.713 5793-6317/com.dozingcatsoftware.cameratimer A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 6317 (RenderThread)

这是相机错误跟踪(1): == ----- pid 187 at 2009-01-01 05:36:48 ----- Cmd line: /system/bin/cameraserver

 "cameraserver" sysTid=187
    #00 pc 00047e55  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
    #01 pc 00047f4d  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+8)
    #02 pc 000484a3  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+38)
    #03 pc 00000c6d  /system/bin/cameraserver
    #04 pc 00017d35  /system/lib/libc.so (__libc_init+48)
    #05 pc 00000b34  /system/bin/cameraserver

  "HwBinder:187_1" sysTid=265
    #00 pc 00049400  /system/lib/libc.so (__ioctl+8)
    #01 pc 0001de4f  /system/lib/libc.so (ioctl+38)
    #02 pc 00010015  /system/lib/libhwbinder.so (_ZN7android8hardware14IPCThreadState14talkWithDriverEb+168)
    #03 pc 0001010d  /system/lib/libhwbinder.so (_ZN7android8hardware14IPCThreadState20getAndExecuteCommandEv+8)
    #04 pc 00010713  /system/lib/libhwbinder.so (_ZN7android8hardware14IPCThreadState14joinThreadPoolEb+38)
    #05 pc 00016e3d  /system/lib/libhwbinder.so
    #06 pc 0000d38d  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
    #07 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #08 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "HwBinder:187_2" sysTid=268
    #00 pc 00049400  /system/lib/libc.so (__ioctl+8)
    #01 pc 0001de4f  /system/lib/libc.so (ioctl+38)
    #02 pc 00010015  /system/lib/libhwbinder.so (_ZN7android8hardware14IPCThreadState14talkWithDriverEb+168)
    #03 pc 0001010d  /system/lib/libhwbinder.so (_ZN7android8hardware14IPCThreadState20getAndExecuteCommandEv+8)
    #04 pc 00010713  /system/lib/libhwbinder.so (_ZN7android8hardware14IPCThreadState14joinThreadPoolEb+38)
    #05 pc 00016e3d  /system/lib/libhwbinder.so
    #06 pc 0000d38d  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
    #07 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #08 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "HotplugThread" sysTid=275
    #00 pc 0004949c  /system/lib/libc.so (__ppoll+20)
    #01 pc 000201c1  /system/lib/libc.so (poll+48)
    #02 pc 00000e4b  /system/lib/libhardware_legacy.so (uevent_next_event+54)
    #03 pc 00003457  /system/lib/hw/camera.imx7d.so
    #04 pc 000039df  /system/lib/hw/camera.imx7d.so
    #05 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #06 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #07 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "cameraserver" sysTid=277
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "cameraserver" sysTid=278
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "cameraserver" sysTid=279
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "Binder:187_1" sysTid=280
    #00 pc 00049400  /system/lib/libc.so (__ioctl+8)
    #01 pc 0001de4f  /system/lib/libc.so (ioctl+38)
    #02 pc 00047e55  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
    #03 pc 00047f4d  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+8)
    #04 pc 000484a3  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+38)
    #05 pc 0005e5ad  /system/lib/libbinder.so
    #06 pc 0000d38d  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
    #07 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #08 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "Binder:187_2" sysTid=1410
    #00 pc 00049400  /system/lib/libc.so (__ioctl+8)
    #01 pc 0001de4f  /system/lib/libc.so (ioctl+38)
    #02 pc 00047e55  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
    #03 pc 00047f4d  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+8)
    #04 pc 000484a3  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+38)
    #05 pc 0005e5ad  /system/lib/libbinder.so
    #06 pc 0000d38d  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
    #07 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #08 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C3Dev-0-ReqQueu" sysTid=1426
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C3Dev-0-ReqQueu" sysTid=1427
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C3Dev-0-ReqQueu" sysTid=1899
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "Binder:187_1" sysTid=3646
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "Binder:187_1" sysTid=3647
    #00 pc 00018d98  /system/lib/libc.so (syscall+28)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0004bf0d  /system/lib/libc++.so (_ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE+8)
    #03 pc 000175bb  /system/lib/libhidlbase.so (_ZN7android8hardware7details17SynchronizedQueueINSt3__18functionIFvvEEEE8wait_popEv+42)
    #04 pc 00017511  /system/lib/libhidlbase.so
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C3Dev-0-Status" sysTid=3648
    #00 pc 00018d9c  /system/lib/libc.so (syscall+32)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 000c0935  /system/lib/libcameraservice.so (_ZN7android7camera313StatusTracker10threadLoopEv+200)
    #03 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #04 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #05 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C3Dev-0-ReqQueu" sysTid=3649
    #00 pc 00018d9c  /system/lib/libc.so (syscall+32)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 000b622b  /system/lib/libcameraservice.so (_ZN7android13Camera3Device13RequestThread12waitIfPausedEv+202)
    #03 pc 000b5fbb  /system/lib/libcameraservice.so (_ZN7android13Camera3Device13RequestThread10threadLoopEv+58)
    #04 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C2-0-FrameProc" sysTid=3650
    #00 pc 00018d9c  /system/lib/libc.so (syscall+32)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 000b0ec1  /system/lib/libcameraservice.so (_ZN7android13Camera3Device16waitForNextFrameEx+212)
    #03 pc 00086c4f  /system/lib/libcameraservice.so (_ZN7android7camera218FrameProcessorBase10threadLoopEv+86)
    #04 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C2-0-CaptureSeq" sysTid=3651
    #00 pc 00009a51  /system/lib/libutils.so (_ZN7android9CallStack6updateEii+52)
    #01 pc 00011595  /system/lib/libutils.so (_ZN7android16ProcessCallStack6updateEv+264)
    #02 pc 000c64a7  /system/lib/libcameraservice.so (_ZN7android7camera312CameraTraces9saveTraceEv+106)
    #03 pc 000b2e67  /system/lib/libcameraservice.so (_ZN7android13Camera3Device20setErrorStateLockedVEPKcSt9__va_list+198)
    #04 pc 000ab6cf  /system/lib/libcameraservice.so (_ZN7android13Camera3Device19setErrorStateLockedEPKcz+30)
    #05 pc 000b0b91  /system/lib/libcameraservice.so (_ZN7android13Camera3Device22waitUntilDrainedLockedEv+64)
    #06 pc 000b0ae7  /system/lib/libcameraservice.so (_ZN7android13Camera3Device16waitUntilDrainedEv+62)
    #07 pc 0009d9c7  /system/lib/libcameraservice.so (_ZN7android7camera216CaptureSequencer10manageDoneERNS_2spINS_13Camera2ClientEEE+186)
    #08 pc 0009dc5b  /system/lib/libcameraservice.so (_ZN7android7camera216CaptureSequencer10threadLoopEv+90)
    #09 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #10 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #11 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C2-0-JpegProc" sysTid=3652
    #00 pc 00018d9c  /system/lib/libc.so (syscall+32)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 00099d19  /system/lib/libcameraservice.so (_ZN7android7camera213JpegProcessor10threadLoopEv+192)
    #03 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #04 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #05 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C2-0-ZslProc" sysTid=3653
    #00 pc 00018d9c  /system/lib/libc.so (syscall+32)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 000a01ef  /system/lib/libcameraservice.so (_ZN7android7camera212ZslProcessor10threadLoopEv+186)
    #03 pc 000a0243  /system/lib/libcameraservice.so (_ZTv0_n32_N7android7camera212ZslProcessor10threadLoopEv+10)
    #04 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #05 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #06 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  "C2-0-CallbkProc" sysTid=3654
    #00 pc 00018d9c  /system/lib/libc.so (syscall+32)
    #01 pc 000476af  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
    #02 pc 0009ad51  /system/lib/libcameraservice.so (_ZN7android7camera217CallbackProcessor10threadLoopEv+192)
    #03 pc 0000d40f  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+270)
    #04 pc 00047c9f  /system/lib/libc.so (_ZL15__pthread_startPv+22)
    #05 pc 0001afbd  /system/lib/libc.so (__start_thread+32)

  ----- end 187 -----

这是 MainActivity 类代码,我做的改动很小。

public class MainActivity extends Activity implements Camera.PictureCallback, Camera.AutoFocusCallback, OnShutterButtonListener {

    static final List<Integer> DELAY_DURATIONS = Arrays.asList(0, 5, 15, 30);
    static final int DEFAULT_DELAY = 5;
    static final String DELAY_PREFERENCES_KEY = "delay";
    int pictureDelay = DEFAULT_DELAY;
    private static final int MY_CAMERA_REQUEST_CODE = 100;
    static final String FLASH_MODE_AUTO = "auto";
    static final String FLASH_MODE_ON = "on";
    static final String FLASH_MODE_OFF = "off";

    Map<String, String> flashButtonLabels = new HashMap<String, String>();

    ARManager arManager;
    SurfaceView cameraView;
    int[] maxCameraViewSize;
    Camera camera;
    ShutterButton shutterButton;
    Button pictureDelayButton;
    Button cancelPictureButton;
    Button switchCameraButton;
    Button flashButton;
    Button numberOfPicturesButton;
    TextView statusTextField;

    // only one beep type for now
    //int beepType;
    //int numBeepTypes = 3;
    //Random RAND = new Random();

    // assign ID when we start a timed picture, used in makeDecrementTimerFunction callback. If the ID changes, the countdown will stop.
    int currentPictureID = 0;

    // PictureView works, but for timed pictures it makes more sense to always go to ViewImageActivity
    // since the user may not be by the camera when it takes the picture
    //PictureView pictureView;
    Uri pictureURI;

    Handler handler = new Handler();
    int pictureTimer = 0;
    boolean hasMultipleCameras;

    List<String> flashModes = new ArrayList<String>();
    int selectedFlashMode;
    boolean flashButtonConfigured = false;

    int picturesToTake = 1;
    List<Uri> pictureURIs;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        if (checkSelfPermission(Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    MY_CAMERA_REQUEST_CODE);
        }
        flashButtonLabels.put(FLASH_MODE_AUTO, getString(R.string.flashButtonAutoLabel));
        flashButtonLabels.put(FLASH_MODE_ON, getString(R.string.flashButtonOnLabel));
        flashButtonLabels.put(FLASH_MODE_OFF, getString(R.string.flashButtonOffLabel));
        try {
            cameraView = (SurfaceView)findViewById(R.id.cameraView);
            arManager = ARManager.createAndSetupCameraView(this, cameraView, null);
            arManager.setCameraOpenedCallback(new Runnable() {public void run() {cameraOpened();}});
            arManager.setCameraStartedCallback(new Runnable() {public void run() {cameraPreviewStarted();}});
        } catch (RuntimeException e) {
            Log.e("CameraTest", "Camera Open filed");
            return;
        }
//      flashButtonLabels.put(FLASH_MODE_AUTO, getString(R.string.flashButtonAutoLabel));
//      flashButtonLabels.put(FLASH_MODE_ON, getString(R.string.flashButtonOnLabel));
//      flashButtonLabels.put(FLASH_MODE_OFF, getString(R.string.flashButtonOffLabel));

//      cameraView = (SurfaceView)findViewById(R.id.cameraView);
//      arManager = ARManager.createAndSetupCameraView(this, cameraView, null);
//      arManager.setCameraOpenedCallback(new Runnable() {public void run() {cameraOpened();}});
//      arManager.setCameraStartedCallback(new Runnable() {public void run() {cameraPreviewStarted();}});

        shutterButton = (ShutterButton)findViewById(R.id.shutterButton);
        shutterButton.setOnShutterButtonListener(this);
        pictureDelayButton = (Button)findViewById(R.id.pictureDelayButton);

        cancelPictureButton = (Button)findViewById(R.id.cancelPictureButton);
        flashButton = (Button)findViewById(R.id.flashButton);
        numberOfPicturesButton = (Button)findViewById(R.id.numberOfPicturesButton);

        switchCameraButton = (Button)findViewById(R.id.switchCameraButton);
        hasMultipleCameras = (CameraUtils.numberOfCameras() > 1);
        switchCameraButton.setVisibility(hasMultipleCameras ? View.VISIBLE : View.GONE);

        statusTextField = (TextView)findViewById(R.id.statusText);

        AndroidUtils.bindOnClickListener(this, pictureDelayButton, "cycleDelay");
        AndroidUtils.bindOnClickListener(this, cancelPictureButton, "cancelSavePicture");
        AndroidUtils.bindOnClickListener(this, switchCameraButton, "switchCamera");
        AndroidUtils.bindOnClickListener(this, flashButton, "cycleFlashMode");
        AndroidUtils.bindOnClickListener(this, numberOfPicturesButton, "toggleNumberOfPictures");
        AndroidUtils.bindOnClickListener(this, findViewById(R.id.helpButton), "doHelp");
        AndroidUtils.bindOnClickListener(this, findViewById(R.id.libraryButton), "openLibrary");

    //  this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        this.readDelayPreference();
        if (camera!=null) {
            camera.setPreviewCallback(null);
            camera.stopPreview();
            camera.release();
            camera = null;
        }

    }

    @Override
    public void onPause() {
        if (pictureTimer > 0) {
            this.cancelSavePicture();
        }
        arManager.stopCamera();
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        arManager.startCameraIfVisible();
        AndroidUtils.setSystemUiLowProfile(cameraView);
    }

    // callback from ARManager
    public void cameraOpened() {
        if (maxCameraViewSize==null) {
            maxCameraViewSize = new int[] {cameraView.getWidth(), cameraView.getHeight()};
        }
        arManager.setPreferredPreviewSize(maxCameraViewSize[0], maxCameraViewSize[1]);
        CameraUtils.setLargestCameraSize(arManager.getCamera());
        //statusTextField.setText(arManager.getCamera().getParameters().getPictureSize().width+"");
        if (!flashButtonConfigured) {
            configureFlashButton();
            flashButtonConfigured = true;
        }
    }

    public void cameraPreviewStarted() {
        // resize camera view to scaled size of preview image
        Camera.Size size = arManager.getCamera().getParameters().getPreviewSize();
        int[] scaledWH = AndroidUtils.scaledWidthAndHeightToMaximum(
                size.width, size.height, maxCameraViewSize[0], maxCameraViewSize[1]);
        cameraView.setLayoutParams(new FrameLayout.LayoutParams(scaledWH[0], scaledWH[1], Gravity.CENTER));
    }

    void updateButtons(boolean allowSave) {
        this.findViewById(R.id.miscButtonBar).setVisibility(allowSave ? View.VISIBLE : View.GONE);
        this.findViewById(R.id.optionsButtonBar).setVisibility(allowSave ? View.VISIBLE : View.GONE);
        shutterButton.setVisibility(allowSave ? View.VISIBLE : View.GONE);
        cancelPictureButton.setVisibility(allowSave ? View.GONE : View.VISIBLE);
    }

    public void cancelSavePicture() {
        pictureTimer = 0;
        ++currentPictureID;
        statusTextField.setText("");
        Toast.makeText(this, getString(R.string.canceledPictureMessage), Toast.LENGTH_SHORT).show();
        updateButtons(true);
    }

    void updateTimerMessage() {
        String messageFormat = getString(R.string.timerCountdownMessageFormat);
        statusTextField.setText(String.format(messageFormat, pictureTimer));
    }

    Runnable makeDecrementTimerFunction(final int pictureID) {
        return new Runnable() {
            public void run() {decrementTimer(pictureID);}
        };
    }

    MediaPlayer.OnCompletionListener releaseMediaPlayerFunction = new MediaPlayer.OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }
    };

    void playTimerBeep() {
        int soundResource = R.raw.beep_sound0;
        MediaPlayer mp = MediaPlayer.create(this, soundResource);
        mp.start();
        mp.setOnCompletionListener(releaseMediaPlayerFunction);
    }

    public void decrementTimer(final int pictureID) {
        if (pictureID!=this.currentPictureID) {
            return;
        }
        boolean takePicture = (pictureTimer==1);
        --pictureTimer;
        if (takePicture) {
            savePictureNow();
            playTimerBeep();
        }
        else if (pictureTimer>0) {
            updateTimerMessage();
            handler.postDelayed(makeDecrementTimerFunction(pictureID), 1000);
            if (pictureTimer<3) playTimerBeep();
        }
    }

    public void savePicture() {
        if (this.pictureDelay==0) {
            savePictureNow();
        }
        else {
            savePictureAfterDelay(this.pictureDelay);
        }
    }

    void savePictureAfterDelay(int delay) {
        pictureTimer = delay;
        updateTimerMessage();
        currentPictureID++;
        handler.postDelayed(makeDecrementTimerFunction(currentPictureID), 1000);
        //beepType = RAND.nextInt(numBeepTypes);

        updateButtons(false);
    }

    public void savePictureNow() {
        pictureURIs = new ArrayList<Uri>();
        statusTextField.setText("Taking picture...");
        arManager.getCamera().autoFocus(this);
    }

    public void switchCamera() {
        flashButtonConfigured = false;
        arManager.switchToNextCamera();
    }
4

0 回答 0