этот вопрос задан раньше (не так, как это), но пока еще не было ответа All Exclusive. поэтому мы пытаемся найти лучшее решение здесь. Я разрабатываю приложение, а в своем приложении скрываю каталог с именем myPic
, перемещая его в каталог с именем .myPic
. когда я скрываю свои фотографии, миниатюры все еще находятся в галерее. я нахожу 3 решения:
первое решение:
используя широковещательный ACTION_MEDIA_MOUNTED:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
проблема с этим кодом заключается в том, что он требует ресурсов hug и, самое главное, он заблокирован с сайта Android 4.4. поэтому использование этого метода не является рациональным для добавления 10 изображений в галерею. поэтому он не является эксклюзивным методом All. также с помощью ACTION_MEDIA_SCANNER_SCAN_FILE
не работает на android 4.4 либо
второе решение:
с помощью MediaScannerConnection
. поэтому я создал цикл for
и передал старый адрес каждого файла, который я скрываю. это моя функция MediaScannerConnection
:
private void scanFile(File file) {
// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
вещь о MediaScannerConnection
заключается в том, что она действует только в том случае, если файл существует. поэтому скажем, что у меня есть изображение под названием 1.jpg
в каталоге myPic
. используя этот класс, я могу сразу добавить 1.jpg
в мою галерею, но когда я перемещаю каталог 1.jpg
в .myPic
, и я просматриваю старый путь 1.jpg
, ничего не происходит. logcat говорит, что этот файл не exsit. поэтому MediaScannerConnection
добавлять файлы в галерею. что, если я передаю новый путь от 1.jpg
до MediaScannerConnection
? хорошо он добавляет 1.jpg
из .myPic
в галерею, и это точно не, что я хочу. поэтому снова не весь эксклюзивный метод
третье решение:
с помощью getContentResolver()
. поэтому для удаления эскизов этот метод может быть окончательным решением. поэтому я пишу код удара. в каждом цикле я получаю путь изображения и передаю его в getContentResolver().delete(Uri.parse(path),null,null)
. вот код:
File myPic = new File(Environment.getExternalStorageDirectory()+"/myPic");
File myPicHide = new File(Environment.getExternalStorageDirectory()+"/.myPic");
if (!(myPicHide.exists()) & !(myPicHide.isDirectory())) {
myPicHide.mkdirs();
};
if (myPic.isDirectory()) {
String[] childeren = myPic.list();
if (childeren.length > 0) {
for (int i = 0; i < childeren.length; i++) {
String fileName = childeren[i];
File from = new File(Environment.getExternalStorageDirectory()+"/myPic"+fileName);
File to = new File(Environment.getExternalStorageDirectory()+"/.myPic"+fileName);
from.renameTo(to);
try {
String path = from.toString();
getContentResolver().delete(Uri.parse(path),null,null);
} catch(Exception e) {
Log.d("Rename", "Error happened");
}
}
}
} else {
Toast.makeText(getApplicationContext(), "myPic directory not found", Toast.LENGTH_LONG).show();
}
но он не работает, и миниатюры моих файлов все еще отображаются на камбузе. так я использую getContentResolver()
неправильно? это может быть весь исключительный метод для ситуации, когда уменьшенные файлы отображаются в галерее. У меня есть путь к файлам, и мне нужно только удалить его из поставщика содержимого медиа-магазина.
обновление:
так что получается, что использование Uri.parse(path)
в третьем решении неверно. Изображение Uri начинается с content://
, и его можно получить с помощью MediaScannerConnection
. поэтому я создал Uri
, называемый imageInGalleryUri
, и присвоил ему значение null
. используя мою функцию scanFile
, время от времени менял ее значение и передавал ее значение getContentResolver()
. вот код:
boolean whereIsMediaState = true;
Uri imageInGalleryUri = null;
File myPic = new File(Environment.getExternalStorageDirectory()+"/myPic");
File myPicHide = new File(Environment.getExternalStorageDirectory()+"/.myPic");
if (!(myPicHide.exists()) & !(myPicHide.isDirectory())) {
myPicHide.mkdirs();
};
if (myPic.isDirectory()) {
String[] childeren = myPic.list();
if (childeren.length > 0) {
for (int i = 0; i < childeren.length; i++) {
String fileName = childeren[i];
File from = new File(Environment.getExternalStorageDirectory()+"/myPic"+fileName);
scanFile(from);
File to = new File(Environment.getExternalStorageDirectory()+"/.myPic"+fileName);
from.renameTo(to);
if (to.isFile()){
try {
getContentResolver().delete(imageInGalleryUri,null,null);}
catch(Exception e) {
Log.d("Rename", "Error happened");
}
}
}
} else {
Toast.makeText(getApplicationContext(), "myPic directory not found", Toast.LENGTH_LONG).show();
}
private void scanFile(File file) {
// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
imageInGalleryUri = uri;
}
});
}
Я попробовал код, но он обнаружил только первое изображение и удалял его из галереи, но не влиял на другие изображения. Я не могу понять, почему. Есть идеи?
Благодарим вас за помощь заранее