Как ACTION_VIDEO_CAPTURE и сохранить видеофайл в определенном каталоге с помощью Delphi ⇐ Android
-
Гость
Как ACTION_VIDEO_CAPTURE и сохранить видеофайл в определенном каталоге с помощью Delphi
Мне нужно записать видео и сохранить его в определенном каталоге. Приложение написано на Delphi 11.1. На самом деле я сначала создаю очень простое приложение, начатое с нуля, чтобы изучить и понять весь задействованный код. Вот что я сделал до сих пор:
[*]Запустил пустое приложение для нескольких устройств одной кнопкой. [*]Включен Безопасный общий доступ к файлам в настройках проекта/приложении/списке прав [*]Создан provider_paths.xml в том же каталоге, что и .dpr, со следующим содержимым: (я не знаю, требуется ли этот шаг и как развернуть файл)
[*]Создайте код для кнопки (каталог создается динамически во время выполнения) procedure TfrmMain.btnACTION_VIDEO_CAPTUREClick(Отправитель: TObject); Вар ACTION_VIDEO_CAPTUREIntent: JIntent; файлури: Jnet_Uri; lФайл: JФайл; имя_файла: строка; начинать имя_файла:= TPath.Combine(FExternalPath,gpcFileName); // FExternalPath — это то же самое, что и внешний путь в поставщике_paths.xml. gpcFileName — «ACTION_VIDEO_CAPTURE.mp4». Если(TJBuild_VERSION.JavaClass.SDK_INT < 24) Тогда fileuri := TJNet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(имя_файла))) Еще начать lFile := TJFile.JavaClass.init(StringToJString(имя_файла)); fileuri:= TJcontent_FileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider'), lФайл) Конец; ACTION_VIDEO_CAPTUREIntent := TJintent.Create; ACTION_VIDEO_CAPTUREIntent.setAction(TJMediaStore.JavaClass.ACTION_VIDEO_CAPTURE); ACTION_VIDEO_CAPTUREIntent.addFlags(TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION); // необходимый? ACTION_VIDEO_CAPTUREIntent.putExtra(TJMediaStore.JavaClass.EXTRA_DURATION_LIMIT,30); ACTION_VIDEO_CAPTUREIntent.putExtra(TJMediaStore.JavaClass.EXTRA_OUTPUT,JParcelable(fileuri)); MainActivity.startActivity(ACTION_VIDEO_CAPTUREIntent); // @ см. ниже TDialogService.ShowMessage('ACTION_VIDEO_CAPTURE завершено') конец; [*]Поскольку приложение было таким простым, я дал разрешение «Камере» вручную. [*]Я ожидаю, что в конце события файл /storage/emulated/0/Documents/ACTION_VIDEO_CAPTURE/ACTION_VIDEO_CAPTURE.mp4 будет существовать, но [*]Исключение возникает в @ Проект ACTION_VIDEO_CAPTURE.apk вызвал класс исключения EJNIException с сообщением 'java.lang.SecurityException: отказ в разрешении: начало намерения { act=android.media.action.VIDEO_CAPTURE flg=0x3 cmp=com.google.android.apps.cameralite/.capture.CaptureActivity clip={text/uri-list hasLabel(0) {U(content)}} (есть дополнительные возможности) } из ProcessRecord{edf0185 28021:mx.com.example.ACTION_VIDEO_CAPTURE/u0a42} (pid=28021, uid=10042) с отозванным разрешение android.permission.CAMERA». Я старый волк Delphi, но кормлю грудью ребенка с Android. Я действительно не знаю, что делаю неправильно. Мне нужен файл в каталоге для дальнейшего использования и удаления. Другой подход, который мне не нравится, — это начать действие, а затем «каким-то образом» узнать, где был записан файл, но я думаю, это будет сложнее, поскольку я хочу позже удалить файл
Как заставить этот код работать? Чего мне не хватает?
Мне нужно записать видео и сохранить его в определенном каталоге. Приложение написано на Delphi 11.1. На самом деле я сначала создаю очень простое приложение, начатое с нуля, чтобы изучить и понять весь задействованный код. Вот что я сделал до сих пор:
[*]Запустил пустое приложение для нескольких устройств одной кнопкой. [*]Включен Безопасный общий доступ к файлам в настройках проекта/приложении/списке прав [*]Создан provider_paths.xml в том же каталоге, что и .dpr, со следующим содержимым: (я не знаю, требуется ли этот шаг и как развернуть файл)
[*]Создайте код для кнопки (каталог создается динамически во время выполнения) procedure TfrmMain.btnACTION_VIDEO_CAPTUREClick(Отправитель: TObject); Вар ACTION_VIDEO_CAPTUREIntent: JIntent; файлури: Jnet_Uri; lФайл: JФайл; имя_файла: строка; начинать имя_файла:= TPath.Combine(FExternalPath,gpcFileName); // FExternalPath — это то же самое, что и внешний путь в поставщике_paths.xml. gpcFileName — «ACTION_VIDEO_CAPTURE.mp4». Если(TJBuild_VERSION.JavaClass.SDK_INT < 24) Тогда fileuri := TJNet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(имя_файла))) Еще начать lFile := TJFile.JavaClass.init(StringToJString(имя_файла)); fileuri:= TJcontent_FileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider'), lФайл) Конец; ACTION_VIDEO_CAPTUREIntent := TJintent.Create; ACTION_VIDEO_CAPTUREIntent.setAction(TJMediaStore.JavaClass.ACTION_VIDEO_CAPTURE); ACTION_VIDEO_CAPTUREIntent.addFlags(TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION); // необходимый? ACTION_VIDEO_CAPTUREIntent.putExtra(TJMediaStore.JavaClass.EXTRA_DURATION_LIMIT,30); ACTION_VIDEO_CAPTUREIntent.putExtra(TJMediaStore.JavaClass.EXTRA_OUTPUT,JParcelable(fileuri)); MainActivity.startActivity(ACTION_VIDEO_CAPTUREIntent); // @ см. ниже TDialogService.ShowMessage('ACTION_VIDEO_CAPTURE завершено') конец; [*]Поскольку приложение было таким простым, я дал разрешение «Камере» вручную. [*]Я ожидаю, что в конце события файл /storage/emulated/0/Documents/ACTION_VIDEO_CAPTURE/ACTION_VIDEO_CAPTURE.mp4 будет существовать, но [*]Исключение возникает в @ Проект ACTION_VIDEO_CAPTURE.apk вызвал класс исключения EJNIException с сообщением 'java.lang.SecurityException: отказ в разрешении: начало намерения { act=android.media.action.VIDEO_CAPTURE flg=0x3 cmp=com.google.android.apps.cameralite/.capture.CaptureActivity clip={text/uri-list hasLabel(0) {U(content)}} (есть дополнительные возможности) } из ProcessRecord{edf0185 28021:mx.com.example.ACTION_VIDEO_CAPTURE/u0a42} (pid=28021, uid=10042) с отозванным разрешение android.permission.CAMERA». Я старый волк Delphi, но кормлю грудью ребенка с Android. Я действительно не знаю, что делаю неправильно. Мне нужен файл в каталоге для дальнейшего использования и удаления. Другой подход, который мне не нравится, — это начать действие, а затем «каким-то образом» узнать, где был записан файл, но я думаю, это будет сложнее, поскольку я хочу позже удалить файл
Как заставить этот код работать? Чего мне не хватает?
Мобильная версия