IllegalStateException с видеопотоком с использованием MediaRecorder - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь снять видеопоток с камеры на смарт-очки без использования предварительного просмотра. В целях тестирования я пытаюсь записать захваченное видео во внутреннюю память смарт-очков, но пока безуспешно. Я пробовал так много вещей, чтобы заставить MediaRecorder работать на моих умных очках Vuzix Blade, но я продолжаю получать исключения и сбои. Я не использую предварительный просмотр камеры, так как приложение позволяет распознавать объекты и возвращать имя объекта на экране.

    public boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)){
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }

    private Camera getCameraInstance() throws IOException {
        if (checkCameraHardware(context)) {
            try {
                 return Camera.open();
                // Attempt to get a camera instance
            } catch (Exception e) {
                // Camera is not available
                Log.e("Camera", "No camera available.");
            }
        }
        throw new InvalidObjectException("Camera not available.");
    }

    void recordVideo() throws IOException {
        String file_path= context.getApplicationContext().getFilesDir().getPath();
        File file = new File(file_path);
        if (!file.exists()){
            file.mkdirs();
        }
        String file_name = file + "test.3gp";

        Camera camera = getCameraInstance();
        camera.unlock();
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setCamera(camera);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

        CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
        mediaRecorder.setProfile(cpHigh);
        mediaRecorder.setOutputFile(file_name);


        try {
            mediaRecorder.prepare();
        } catch (IllegalStateException e) {
            //e.printStackTrace();
            Log.w("MediaRecorder", "Can't prepare MediaRecorder");
            finish();
        }

        mediaRecorder.start();

    }

    void finish() {
        mediaRecorder.stop();
    }
}

Манифест имеет следующие разрешения:

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <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" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

Следующий код является трассировкой стека:

04-01 18:10:50.611 3881-3881/nl.queensland2.smartglasses E/AndroidRuntime: FATAL EXCEPTION: main
    Process: nl.queensland2.smartglasses, PID: 3881
    java.lang.IllegalStateException
        at android.media.MediaRecorder.start(Native Method)
        at nl.queensland2.smartglasses.CameraHandler.recordVideo(CameraHandler.java:78)
        at nl.queensland2.smartglasses.MainActivity.startCamera(MainActivity.java:47)
        at nl.queensland2.smartglasses.MainActivity.onStartButton(MainActivity.java:18)
        at nl.queensland2.smartglasses.-$$Lambda$KXk0yJI_VzEUWeY3qtg9yXybkUM.onClick(lambda)
        at android.view.View.performClick(View.java:4780)
        at android.view.View.onKeyUp(View.java:9023)
        at android.widget.TextView.onKeyUp(TextView.java:5899)
        at android.view.KeyEvent.dispatch(KeyEvent.java:2643)
        at android.view.View.dispatchKeyEvent(View.java:8411)
        at android.widget.TextView.dispatchKeyEvent(TextView.java:9531)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2365)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1713)
        at androidx.core.view.KeyEventDispatcher.activitySuperDispatchKeyEventPre28(KeyEventDispatcher.java:130)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:87)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:133)
        at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:558)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2814)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2280)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4023)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3985)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3547)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3600)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3566)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3683)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3574)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3740)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3547)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3600)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3566)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3574)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3547)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3600)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3566)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3716)
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3877)
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2208)
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1849)
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1840)
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2185)
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:143)
        at android.os.Looper.loop(

Кто-нибудь видит, в чем проблема?

...