Java 使用文件提供程序将相机照片从片段保存到库
我正在关注如何将相机拍摄的照片保存到图库中的文档 他们希望您使用Java 使用文件提供程序将相机照片从片段保存到库,java,android,android-fragments,Java,Android,Android Fragments,我正在关注如何将相机拍摄的照片保存到图库中的文档 他们希望您使用getExternalFilesDir创建一个文件 String mCurrentPhotoPath; private File createImageFile() throws IOException { // Create an image file name String imageFileName = "JPEG_" + UUID.randomUUID();
getExternalFilesDir
创建一个文件
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String imageFileName = "JPEG_" + UUID.randomUUID();
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
mCurrentPhotoPath等于/storage/emulated/0/Android/data/com.mycompany.myapp/files/Pictures/jpeg22fda6f2-dad9-4dd9-b327-c1130c8df0eb187766077.jpg
但是在下一部分,最重要的部分,将照片添加到图库中
他们说:
如果您将照片保存到
getExternalFilesDir(),媒体扫描程序无法访问这些文件
因为它们对你的应用程序是私有的
这正是他们使用的方法。getExternalFilesDir()-(
所以我也看了一下上面的。我还不太明白我需要使用哪个目录方法。我尝试了getFilesDir()
,但它不喜欢环境。目录图片
但是他们没有提供一种使用他们的方法保存到库中的方法,他们的代码片段不起作用
private void cameraIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
ex.printStackTrace();
}
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(getActivity().getApplicationContext(), "com.mycompany.myapp.fileprovider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_CODE_CAPUTURE_IMAGE);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_CAPUTURE_IMAGE && resultCode == Activity.RESULT_OK) {
galleryAddPic();
}
}
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
因此,我的应用程序不会将图片保存到库中。我根本看不到它将图片保存在哪里
有人知道我做错了什么吗?当您将文件添加到Android的文件系统时,MedaScanner不会自动拾取这些文件,而且Android只在重新启动时运行完全媒体扫描。问题是完全扫描需要很长时间
一种解决方案是使用静态scanFile()方法。如果您只需要知道文件是何时添加的,您可以将的静态方法scanFile()与
名称不好,因为它实际上需要一系列路径,因此可以用于一次添加多个文件,而不仅仅是一个文件,但它仍然可以满足我们的需要。
以下是如何使用此方法:
MediaScannerConnection.scanFile(
getApplicationContext(),
new String[]{file.getAbsolutePath()},
null,
new OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.v("grokkingandroid",
"file " + path + " was scanned seccessfully: " + uri);
}
});
以下信息是静态scanFile()方法的参数
- 上下文:应用程序上下文
- 路径:包含要添加的文件路径的字符串数组
- mimeTypes:包含文件mime类型的字符串数组
- 回调:扫描完成时将通知MediaScannerConnection.OnScanCompletedListener
我希望这会有所帮助。“他们使用的是确切的方法”--文档中的这一段是不正确的。
getExternalFilesDir()
是应用程序特有的,但它不是应用程序的私有内容。“他们的代码片段不起作用”--尝试MediaScannerConnection
及其scanFile()
方法。我尝试了这个方法,但照片从未保存到我的相机卷中。