AndroidX Сохраняет видео с именем файла

#video #storage #androidx

#Видео #Хранение #androidx

Вопрос:

Я использовал реализацию приложения для камеры из блога. В блоге приведены инструкции по созданию снимка и его сохранению в определенном месте в приложении. Я пытаюсь повторить то же самое с видеофайлом.

Ниже приведен мой код:

 private void chooseImageFromGallery() {
    Dexter.withActivity(this)
            .withPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) {
                    if (report.areAllPermissionsGranted()) {
                        videoFileName = System.currentTimeMillis()   ".mp4";
                        SaveSharedPreference.setImageName( getApplicationContext(), videoFileName );
                        Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                        videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, getCacheImagePathForVideo(videoFileName));
                        if (videoIntent.resolveActivity( getPackageManager()  )!= null) {
                            startActivityForResult( videoIntent, REQUEST_VIDEO_CAPTURE );
                        }
                    }
                }
                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                    token.continuePermissionRequest();
                }
            }).check();
}

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult( requestCode, resultCode, data );
      
            case REQUEST_VIDEO_CAPTURE:
                if (resultCode == RESULT_OK) {
                    videoUri = data.getData();
                    setResultOk(videoUri);
                } else {
                    setResultCancelled();
                }
                break;
            default:
                setResultCancelled();
        }
    }

  private void setResultOk(Uri imagePath) {
        Intent intent = new Intent();
        intent.putExtra("path", imagePath);
        Log.i("Path:", imagePath.toString());
        setResult( Activity.RESULT_OK, intent);
        finish();
    }

  private Uri getCacheImagePathForVideo(String fileName) {
        File path = new File(getExternalCacheDir(), "camera");
        if (!path.exists()) path.mkdirs();
        File videoFil = new File(path, videoFileName);
        return getUriForFile(ImagePickerActivity.this, getPackageName()   ".provider", videoFil);
    
    }
  

Аналогичный код работает для изображений, но не для видео. Я не уверен, что мои действия activityResult верны.

Кроме того, тот же код без ссылок на имена файлов сохраняет видео в mnt / sdcard / Camera / VID_ **.mp4

Это мое первое приложение … поэтому многие вещи для меня новы.

Ответ №1:

Я решил после просмотра документации по Android. У меня сработало следующее.

Манифест Android

Внутри тега приложения добавьте это:

  <provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.reluai.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">

    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />  //create this file in xml folder as xml resource file.  If you do not have this folder create one.
 </provider>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  

file_paths.xml

 <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    <files-path name="my_videos" path="videos/"/>
</paths>
  

Я хотел создать две папки внутри моего приложения с именами изображений и видео. Эти папки создаются как вложенные папки внутри папки с именем files .

Внутри моего activity.java

Ниже приведен код для создания папки для изображений.

 private Uri getCacheImagePath(String fileName) {
        File imagePath = new File(getApplicationContext().getFilesDir(), "images");
        if (!imagePath.exists()) imagePath.mkdirs();
        File newFile = new File(imagePath, fileName);
        Uri contentUri = getUriForFile( getApplicationContext(),"com.example.fileprovider",newFile );
        return contentUri;
    }
  

Функция Uri поставщика для видео точно такая же. Просто убедитесь, что вы указали разные имена для файла, Uri и т. Д. В соответствии с видео.

Захват изображения:

 private void takeCameraImage() {
        Dexter.withActivity(this)
                .withPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .withListener(new MultiplePermissionsListener() {
                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport report) {
                        if (report.areAllPermissionsGranted()) {
                            fileName = System.currentTimeMillis()   ".jpg";
                            SaveSharedPreference.setImageName( getApplicationContext(), fileName );
                            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, getCacheImagePath(fileName));
                            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                                startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                            }
                        }
                    }
                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                        token.continuePermissionRequest();
                    }
                }).check();
    }
  

Если вы не используете Dexter для управления разрешениями, вы можете удалить эту часть.
Вышеизложенное добавляет выбранное изображение в папку images. Аналогичный код, настроенный для видео, тоже работает.