J'enregistre une image sur la carte SD et celle-ci n'apparaît pas dans l'application Galerie tant que je n'ai pas retiré la carte SD et que je ne l'ai retournée.
Avez-vous une idée pourquoi c'est comme ça?
On dirait que l'application Gallery a du cache qui n'est pas mis à jour lors de la sauvegarde des fichiers ...
En fait, je veux aussi ouvrir l’image que je viens de sauvegarder dans l’application Galerie et ne pas y réussir.
this est ma question sur cette question.
Le système scanne la carte SD lorsqu'elle est montée pour rechercher de nouveaux fichiers image (et autres). Si vous ajoutez un fichier par programme, vous pouvez utiliser cette classe:
http://developer.Android.com/reference/Android/media/MediaScannerConnection.html
Une solution plus simple consiste à utiliser la méthode de commodité statique scanFile () :
File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);
où this
est votre activité (ou quel que soit le contexte), le type mime n'est nécessaire que si vous utilisez des extensions de fichier non standard et la null
correspond au rappel facultatif (ce dont nous n'avons pas besoin pour un cas aussi simple).
Ma réponse à la question initiale et à toute autre personne pouvant avoir ce problème:
J'avais le même problème: les images de mon application enregistrées par des personnes enregistrées sur la carte SD ne figuraient pas immédiatement dans leur galerie. Après quelques recherches, j'ai trouvé cette ligne de code insérée après le code "enregistrer sur la carte sd" qui corrigeait le problème:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Vous pouvez également ajouter une image à la médiathèque par intention. Consultez l'exemple de code pour voir comment cela se passe:
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);
Actualisation de la galerie, y compris 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())));
}
Voici le code pour le MediaScannerConnection:
MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();
newfile est l'objet File de votre nouveau fichier/enregistré.
il y a une application dans l'émulateur qui dit - 'Outils de développement'
cliquez dessus et sélectionnez "Balayage multimédia" .. toutes les images seront numérisées
Laissez votre activité implémenter 'MediaScannerConnectionClient' Et ajoutez-la à votre activité:
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();
}
ce travail avec moi
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())));
Ne semble pas fonctionner sur KitKat. Il lève l'exception de refus d'autorisation et bloque l'application .
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)));
J'espère que ça aide.
Je partage ici le code qui permet de charger une image sous forme de bitmap et de l'enregistrer sur la galerie sdcard dans le dossier de noms d'applications ..__ Vous devriez suivre ces étapes
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);
}
});
Mon code pour 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();
}
}
Utilisez ceci après avoir sauvegardé l'image
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Vous devez donner des autorisations à l'application Galerie . Il suffit d'appuyer longuement sur l'icône de l'application Galerie dans l'écran d'accueil et de taper sur 'APP INFO' qui apparaît en haut de l'écran. Cela affichera les paramètres de l'application de la galerie. Maintenant, allez dans l'onglet Autorisations et activez le stockage, les autorisations de l'appareil photo en le basculant .. Maintenant, allez dans votre application de galerie native et vous obtiendrez vos images enregistrées.