Изображение, сохраненное на SD-карте, не отображается в приложении Android Gallery
Я сохраняю изображение на SD-карте, и оно не появляется в приложении "Галерея", пока я не вытащил SD-карту и не вернул ее.
У вас есть идея, почему это так?
Похоже, что приложение Gallery имеет некоторый кеш, который не обновляется при сохранении файла...
На самом деле, я также хочу открыть только что сохраненное изображение в приложении "Галерея" и не добился успеха в этом
этом, это мой вопрос по этой проблеме.
Ответы
Ответ 1
Система сканирует SD-карту, когда она монтируется, чтобы найти любые новые изображения (и другие) файлы. Если вы программно добавляете файл, вы можете использовать этот класс:
http://developer.android.com/reference/android/media/MediaScannerConnection.html
Ответ 2
Более простым решением является использование статического метода удобства scanFile():
File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);
где this
- ваша деятельность (или любой другой контекст), тип mime необходим только в том случае, если вы используете нестандартные расширения файлов, а null
- для необязательного обратного вызова (который нам не нужен такой простой случай).
Ответ 3
Мой ответ на исходный вопрос и любому другому, у кого может быть эта проблема:
У меня была такая же проблема, изображения в моем приложении, что люди, сохраненные на SD-карте, сразу не появлялись в своей галерее. После некоторого поиска я нашел эту одну строку кода, вставленную после кода "save to sdcard", который исправил проблему:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Ответ 4
Вы также можете добавить изображение в медиа-галерею по своему желанию, посмотрите пример кода, чтобы увидеть, как это делается:
ContentValues image = new ContentValues();
image.put(Images.Media.TITLE, imageTitle);
image.put(Images.Media.DISPLAY_NAME, imageDisplayName);
image.put(Images.Media.DESCRIPTION, imageDescription);
image.put(Images.Media.DATE_ADDED, dateTaken);
image.put(Images.Media.DATE_TAKEN, dateTaken);
image.put(Images.Media.DATE_MODIFIED, dateTaken);
image.put(Images.Media.MIME_TYPE, "image/png");
image.put(Images.Media.ORIENTATION, 0);
File parent = imageFile.getParentFile();
String path = parent.toString().toLowerCase();
String name = parent.getName().toLowerCase();
image.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, name);
image.put(Images.Media.SIZE, imageFile.length());
image.put(Images.Media.DATA, imageFile.getAbsolutePath());
Uri result = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
Ответ 5
Обновление галереи, включая Android KITKAT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
else
{
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
Ответ 6
Вот код для MediaScannerConnection:
MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();
newfile - это объект File вашего нового/сохраненного файла.
Ответ 7
в эмуляторе есть приложение, в котором говорится: "Dev Tools"
нажмите на это и выберите "Media Scanning".. все изображения будут отсканированы
Ответ 8
Пусть ваша деятельность реализует "MediaScannerConnectionClient"
и добавьте это в свою деятельность:
private void startScan()
{
if(conn!=null) conn.disconnect();
conn = new MediaScannerConnection(YourActivity.this,YourActivity.this);
conn.connect();
}
@Override
public void onMediaScannerConnected() {
try{
conn.scanFile(yourImagePath, "image/*");
} catch (java.lang.IllegalStateException e){
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
conn.disconnect();
}
Ответ 9
эта работа со мной
File file = ..... // Save file
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
Ответ 10
Здесь я использую код, который может загружать изображение в виде растрового изображения и сохранять это изображение в галерее sdcard в папке с именем приложения.
Вы должны выполнить следующие шаги.
- Загрузка растрового изображения сначала
private Bitmap loadBitmap(String url) {
try {
InputStream in = new java.net.URL(url).openStream();
return BitmapFactory.decodeStream(in);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
- Также просьба предоставить следующие разрешения в вашем файле AndroidManifest.xml.
uses-permission android:name="android.permission.INTERNET"
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
- Вот целый код, который написан в Activty, в котором мы хотим выполнить эту задачу.
void saveMyImage(String appName, String imageUrl, String imageName) {
Bitmap bmImg = loadBitmap(imageUrl);
File filename;
try {
String path1 = android.os.Environment.getExternalStorageDirectory()
.toString();
File file = new File(path1 + "/" + appName);
if (!file.exists())
file.mkdirs();
filename = new File(file.getAbsolutePath() + "/" + imageName
+ ".jpg");
FileOutputStream out = new FileOutputStream(filename);
bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
ContentValues image = new ContentValues();
image.put(Images.Media.TITLE, appName);
image.put(Images.Media.DISPLAY_NAME, imageName);
image.put(Images.Media.DESCRIPTION, "App Image");
image.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
image.put(Images.Media.MIME_TYPE, "image/jpg");
image.put(Images.Media.ORIENTATION, 0);
File parent = filename.getParentFile();
image.put(Images.ImageColumns.BUCKET_ID, parent.toString()
.toLowerCase().hashCode());
image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, parent.getName()
.toLowerCase());
image.put(Images.Media.SIZE, filename.length());
image.put(Images.Media.DATA, filename.getAbsolutePath());
Uri result = getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
Toast.makeText(getApplicationContext(),
"File is Saved in " + filename, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
- Надеюсь, что он может решить всю вашу проблему.
Ответ 11
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Кажется, что не работает над KITKAT. Он выдает исключение отказа в разрешении и приводит к сбою приложения.
Поэтому для этого я сделал следующее,
String path = mediaStorageDir.getPath() + File.separator
+ "IMG_Some_name.jpg";
CameraActivity.this.sendBroadcast(new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
.parse("file://" + path)));
Надеюсь, что это поможет.
Ответ 12
File folderGIF = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/newgif2"); //path where gif will be stored
success = folderGIF.mkdir(); //make directory
String finalPath = folderGIF + "/test1.gif"; //path of file
.....
/* changes in gallery app if any changes in done*/
MediaScannerConnection.scanFile(this,
new String[]{finalPath}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Ответ 13
Мой код для MyMediaConnectorClient:
public class MyMediaConnectorClient implements MediaScannerConnectionClient {
String _fisier;
MediaScannerConnection MEDIA_SCANNER_CONNECTION;
public MyMediaConnectorClient(String nume) {
_fisier = nume;
}
public void setScanner(MediaScannerConnection msc){
MEDIA_SCANNER_CONNECTION = msc;
}
@Override
public void onMediaScannerConnected() {
MEDIA_SCANNER_CONNECTION.scanFile(_fisier, null);
}
@Override
public void onScanCompleted(String path, Uri uri) {
if(path.equals(_fisier))
MEDIA_SCANNER_CONNECTION.disconnect();
}
}
Ответ 14
Используйте это после сохранения изображения
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Ответ 15
Вы должны предоставить разрешения для приложения Gallery. Просто нажмите на значок приложения галереи на главном экране и нажмите "APP INFO", который появляется в верхней части экрана. При этом будут показаны настройки приложения галереи. Теперь перейдите на вкладку "Разрешения" и включите разрешение на хранение, разрешение камеры, переключив его. Теперь перейдите в свое собственное приложение галереи, и вы получите свои сохраненные изображения.