从我的应用程序文件夹中删除的图像仍在相册中
Images deleted from my application folder are still in the camera gallery
我正在尝试删除通过相机 api 拍摄的图像,原则上它确实会从我的应用程序文件夹中删除它们,但图像仍在 DCIM/camera 文件夹中。
我正在使用 Android 版本 9 的 ITOS 设备。
这是我正在使用的代码。
manifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
------
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.cameratest.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
@xml/file_paths
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external"
path="." />
<external-files-path
name="external_files"
path="." />
<cache-path
name="cache"
path="." />
<external-cache-path
name="external_cache"
path="." />
<files-path
name="files"
path="." />
</paths>
这就是我捕捉图像的方式:
private void checkPermissions(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
} else {
captureImage();
}
} else {
captureImage();
}
}
private void captureImage() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
File imageFile = null;
try {
imageFile = getImageFile();
} catch (IOException e) {
Log.d("TAG", "captureImage ERROR: " + e.getMessage());
e.printStackTrace();
}
if (imageFile != null) {
Uri imageUri = FileProvider.getUriForFile(this, Constants.FILE_AUTHORITY_PROVIDER, imageFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
}
private File getImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "IMG_" + timeStamp;
File storageDir = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"MisFotos");
if (! storageDir.exists()){
if (! storageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
File image = new File(storageDir.getPath() + File.separator + imageFileName + ".jpg");
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
Log.d("PHOTO_TAG", "getImageFile: " + currentPhotoPath);
return image;
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
setPictureToDataBase();
}
}
已更新
我将图像路径保存在数据库中,然后检索它以删除文件。
这是我用来删除图片适配器中图像的代码
public void deletePicture(Picture picture) {
try {
myDatabase.deletePicture(picture.getUid());
String path = picture.getImage();//storageDir.getPath() + File.separator + imageFileName + ".jpg"
pictures.remove(picture);
notifyDataSetChanged();
if (pictures != null && pictures.size()>0){
listener.onDeleteClick( pictures.size());
}else {
listener.onDeleteClick( 0);
}
File target = new File(path);
if (target.exists()) {
target.delete();
}
else {
Log.d("TAG_DELETE_PICTURE", "ERROR: FILE NOT EXITS");
}
} catch (Exception e) {
Log.d("deletePicture", "ERROR: " + e.getMessage());
}
}
当我打开设备文件资源管理器时,它位于“MyPhotos”和 DCIM/camera 中。
same image, two places
从应用程序文件夹中删除图像时工作正常,但在查看时DCIM/camera图像仍然存在并占用内存。
我是不是做错了什么,有没有办法删除DCIM/camera中保存的图片?
我要拍照,只保存在应用程序的文件夹中,不保存在其他地方。还有其他方法吗?
Am I doing something wrong
您正在通过 ACTION_IMAGE_CAPTURE
启动相机应用程序。有数以万计的 Android 设备型号。这些设备型号将预装数十种不同的相机应用,用户可以从 Play 商店和其他地方安装其他相机应用。
这些相机应用程序的功能取决于它们的开发人员。
在您的情况下,您碰巧使用的相机应用程序将照片保存在其正常位置并在 EXTRA_OUTPUT
标识的位置制作副本。很少有相机应用会这样做,但相机应用这样做是完全合法的。
I want to take the photo, save it only in the folder of the application, and not save it anywhere else. Is there any other way to do this?
不要使用 ACTION_IMAGE_CAPTURE
。相反,直接或通过包装器库(Google 的 CameraX、FotoApparat、CameraKit-Android 等)使用相机 API。
我正在尝试删除通过相机 api 拍摄的图像,原则上它确实会从我的应用程序文件夹中删除它们,但图像仍在 DCIM/camera 文件夹中。
我正在使用 Android 版本 9 的 ITOS 设备。
这是我正在使用的代码。
manifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
------
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.cameratest.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
@xml/file_paths
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external"
path="." />
<external-files-path
name="external_files"
path="." />
<cache-path
name="cache"
path="." />
<external-cache-path
name="external_cache"
path="." />
<files-path
name="files"
path="." />
</paths>
这就是我捕捉图像的方式:
private void checkPermissions(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
} else {
captureImage();
}
} else {
captureImage();
}
}
private void captureImage() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
File imageFile = null;
try {
imageFile = getImageFile();
} catch (IOException e) {
Log.d("TAG", "captureImage ERROR: " + e.getMessage());
e.printStackTrace();
}
if (imageFile != null) {
Uri imageUri = FileProvider.getUriForFile(this, Constants.FILE_AUTHORITY_PROVIDER, imageFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
}
private File getImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "IMG_" + timeStamp;
File storageDir = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"MisFotos");
if (! storageDir.exists()){
if (! storageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
File image = new File(storageDir.getPath() + File.separator + imageFileName + ".jpg");
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
Log.d("PHOTO_TAG", "getImageFile: " + currentPhotoPath);
return image;
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
setPictureToDataBase();
}
}
已更新 我将图像路径保存在数据库中,然后检索它以删除文件。
这是我用来删除图片适配器中图像的代码
public void deletePicture(Picture picture) {
try {
myDatabase.deletePicture(picture.getUid());
String path = picture.getImage();//storageDir.getPath() + File.separator + imageFileName + ".jpg"
pictures.remove(picture);
notifyDataSetChanged();
if (pictures != null && pictures.size()>0){
listener.onDeleteClick( pictures.size());
}else {
listener.onDeleteClick( 0);
}
File target = new File(path);
if (target.exists()) {
target.delete();
}
else {
Log.d("TAG_DELETE_PICTURE", "ERROR: FILE NOT EXITS");
}
} catch (Exception e) {
Log.d("deletePicture", "ERROR: " + e.getMessage());
}
}
当我打开设备文件资源管理器时,它位于“MyPhotos”和 DCIM/camera 中。 same image, two places
从应用程序文件夹中删除图像时工作正常,但在查看时DCIM/camera图像仍然存在并占用内存。
我是不是做错了什么,有没有办法删除DCIM/camera中保存的图片?
我要拍照,只保存在应用程序的文件夹中,不保存在其他地方。还有其他方法吗?
Am I doing something wrong
您正在通过 ACTION_IMAGE_CAPTURE
启动相机应用程序。有数以万计的 Android 设备型号。这些设备型号将预装数十种不同的相机应用,用户可以从 Play 商店和其他地方安装其他相机应用。
这些相机应用程序的功能取决于它们的开发人员。
在您的情况下,您碰巧使用的相机应用程序将照片保存在其正常位置并在 EXTRA_OUTPUT
标识的位置制作副本。很少有相机应用会这样做,但相机应用这样做是完全合法的。
I want to take the photo, save it only in the folder of the application, and not save it anywhere else. Is there any other way to do this?
不要使用 ACTION_IMAGE_CAPTURE
。相反,直接或通过包装器库(Google 的 CameraX、FotoApparat、CameraKit-Android 等)使用相机 API。