Как записать видео в Android, разрешив только альбомный режим с максимальным временем записи - PullRequest
0 голосов
/ 04 мая 2020

Мне нужно только записать видео на устройство Android с некоторыми характеристиками. Тем не менее, я действительно разочарован, потому что все, что я пытаюсь решить какую-то странную проблему системы, появилось, и я go вернулся к началу. Поэтому мне нужен более опытный разработчик, который бы помог мне.

Технические характеристики

Мне нужно следующее:

  • Базовый c видеоинтерфейс (пользователь видит, что записано).
  • Время видео не может превышать 20 с (Макс .: 20 с после того, как запись останавливается).
  • Включен только ландшафтный режим. Заблокируйте пользователя, чтобы он не мог записывать в портретном режиме.
  • Кнопка конфигурации должна быть включена. Кнопка настройки, позволяющая пользователю изменять разрешение видео
  • Должна быть включена кнопка передней и задней камеры.
  • Насколько это возможно, устройства должны быть совместимы с моим приложением.

Что я уже пробовал

Приведенный ниже код был моей первой попыткой . Я был счастлив, потому что это работает, но он не может заблокировать видео портретной записи. Итак, я прочитал из какого-то другого вопроса здесь, что я должен использовать для этого API camera2 android.

Uri videoUri = FileProvider.getUriForFile(this, "com.my.myapplication.fileprovider", videofile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, VIDEO_DURATION);
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // this won't work
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_LOCKED); // neither this
startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);

Итак, я получил вторую попытку . Я изменил свой код на API-интерфейс camera2, чтобы знать, что большинство устройств Samsung его не поддерживают. Вот мой источник этой информации . Конечно, я только что обнаружил, что после того, как в моем коде появились странные ошибки.

Я следовал этому коду: код androidwave

И этот код: lytcom / Camera2Kit

И этот код: googlearchive / android -Camera2Video

Которые практически одинаковы.

Поскольку устройства не ' Они не совместимы с API-интерфейсом Camera2, они не будут возвращать видео в хорошем качестве. Я знаю, что на моем устройстве установлена ​​камера с разрешением 1920x1080, но метод возврата системы

E/Camera2VideoFragment: Width: 1440 Height 1080
E/Camera2VideoFragment: Width: 1088 Height 1088
E/Camera2VideoFragment: Width: 1472 Height 720
E/Camera2VideoFragment: Width: 1280 Height 720
E/Camera2VideoFragment: Width: 1056 Height 864
E/Camera2VideoFragment: Width: 960 Height 720

Моя третья попытка . Я использовал библиотеку JeroenMols / LandscapeVideoCamera , которая дает мне именно то, что мне нужно, включая эту красивую картинку, на которой пользователь поворачивает устройство перед записью. Однако эта библиотека не будет работать для API> 22, source .

В настоящее время

NOW , я не знаю не знаю что делать Что бы я ни пытался, ничего не получалось. И большинство ответов вокруг только что использовали эти библиотеки. Так может кто-нибудь помочь мне? Пожалуйста Java язык. Я не могу справиться Kotlin.

1 Ответ

0 голосов
/ 06 мая 2020

Поскольку я нахожусь в ру sh, я решил мою проблему с библиотекой JeroenMols / LandscapeVideoCamera . Возможно из-за несовместимости версии Android мне нужно будет изменить позже. Несмотря на это, я напишу свой ответ здесь, может быть, поможет кому-то еще.

Основная проблема при использовании этой библиотеки с новой android версией (> = Android .M) - это разрешения времени выполнения. Помимо добавления этих разрешений в манифест, я запросил все необходимые разрешения во время выполнения: запись камеры, аудио и хранилища.

Код для LandscapeVideoCamera

void startCamera(){

            CaptureConfiguration.Builder builder = new CaptureConfiguration.Builder(width, height, bitrate);
            builder.maxDuration(20);
            builder.frameRate(24);
            builder.showRecordingTime();
            CaptureConfiguration configuration = builder.build();
            final Intent intent = new Intent(this, VideoCaptureActivity.class);
            intent.putExtra(VideoCaptureActivity.EXTRA_CAPTURE_CONFIGURATION, configuration);
            intent.putExtra(VideoCaptureActivity.EXTRA_OUTPUT_FILENAME, videofile.getAbsolutePath());
            startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);
}

Запрашиваемые разрешения

    public void launchCamera(View v){
         //first test if SDK is Marshmallow

            // if it's then we need to ask permission during run time
            //first check if we already got permission
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                requestStoragePermission();
                return;
            }
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
                requestCameraPermission();
                return;
            }
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO)
                    != PackageManager.PERMISSION_GRANTED) {
                requestAudioRecordPermission();
                return;
            }
            startCamera();
        }
    }

Запрос на получение разрешения

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode == STORAGE_PERMISSION_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){               
                // permission given
                startCamera();
            }
            else{
                // permission not given
            }
        }
        if(requestCode == CAMERA_PERMISSION_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                // permission given
                startCamera();
            }
            else{
                // permission not given
            }
        }
        if(requestCode == AUDIO_PERMISSION_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){                
                startCamera();
            }
            else{
                // permission not given
            }
        }
    }
...