Ich speichere ein Bild auf der SD-Karte und es erscheint nicht in der Galerie-Anwendung, bis ich die SD-Karte herausnehme und zurücksende.
Hast du eine Ahnung, warum das so ist?
Scheint, als hätte die Gallery-Anwendung einen Cache, der beim Speichern der Datei nicht aktualisiert wird ...
Eigentlich möchte ich auch das gerade gespeicherte Bild in der Galerie-Anwendung öffnen und habe damit keinen Erfolg
das ist meine Frage zu diesem Thema.
Das System durchsucht die SD-Karte, wenn sie eingehängt ist, um neue Bilddateien (und andere Dateien) zu finden. Wenn Sie programmgesteuert eine Datei hinzufügen, können Sie diese Klasse verwenden:
http://developer.Android.com/reference/Android/media/MediaScannerConnection.html
Eine einfachere Lösung ist die Verwendung der statischen Convenience-Methode scanFile () :
File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);
wenn this
Ihre Aktivität (oder welcher Kontext auch immer) ist, ist der Mime-Typ nur erforderlich, wenn Sie nicht standardmäßige Dateierweiterungen verwenden, und null
ist für den optionalen Rückruf (den wir für diesen einfachen Fall nicht benötigen).
Meine Antwort auf die ursprüngliche Frage und alle anderen Personen, die dieses Problem haben könnten:
Ich hatte das gleiche Problem, Bilder in meiner App, die auf der SD-Karte gespeicherte Personen nicht sofort in ihrer Galerie angezeigt wurden. Nach einiger Suche fand ich diese eine Codezeile, die nach meinem "Save to SD-Card" -Code eingefügt wurde, der das Problem behoben hat:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Sie können der Media Gallery auch ein Bild hinzufügen, indem Sie einen bestimmten Code verwenden.
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);
Galerie-Aktualisierung einschließlich 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())));
}
Hier ist der Code für die MediaScannerConnection:
MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();
newfile ist das File-Objekt Ihrer neuen/gespeicherten Datei.
es gibt eine App im Emulator, die besagt: "Dev Tools"
klicken Sie darauf und wählen Sie "Media Scanning". Alle Bilder werden gescannt
Lassen Sie Ihre Aktivität "MediaScannerConnectionClient" Implementieren und fügen Sie dies Ihrer Aktivität hinzu:
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();
}
diese Arbeit mit mir
File file = ..... // Save file
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Scheint nicht an KitKat zu arbeiten. Es wirft eine Ausnahme wegen Berechtigungsverweigerung und stürzt die App ab . Deshalb habe ich Folgendes getan:
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)));
Ich hoffe es hilft.
Hier teile ich Code, der das Bild in Form einer Bitmap laden und in der SD-Galerie im App-Namensordner speichern kann. Sie sollten diesen Schritten folgen
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;
}
uses-permission Android:name="Android.permission.INTERNET"
uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
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();
}
}
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);
}
});
Mein Code für 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();
}
}
Verwenden Sie dies, nachdem Sie das Bild gespeichert haben
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Sie müssen der Galerie-App Berechtigungen erteilen. __ Drücken Sie einfach lange auf das Symbol der Galerie-App auf dem Startbildschirm und tippen Sie auf "APP INFO", die oben im Bildschirm angezeigt wird. Dadurch werden die Einstellungen der Galerie-App angezeigt. Gehen Sie jetzt auf die Registerkarte Berechtigungen, und aktivieren Sie die Speicherung, die Kameraberechtigungen, indem Sie sie umschalten .. __ Gehen Sie jetzt in Ihre native Galerie-App und Sie erhalten die gespeicherten Bilder.