#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. Аналогичный код, настроенный для видео, тоже работает.