问题描述
我使用了博客中的相机应用实现。该博客提供了拍摄照片并将其保存在应用程序内某个位置的步骤。我正在尝试用视频文件复制同样的内容。
以下是我的代码:
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
这是我的第一个应用程序...因此,很多事情对我来说都是新的。
解决方法
浏览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的文件夹内的子文件夹。
在我的活动中。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功能完全相同。只需确保为File,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来管理权限,则可以删除该部分。 上面将单击的图像添加到图像文件夹。为视频定制的类似代码也可以使用。