Notre application a donc la possibilité de prendre une photo ou une vidéo. Si l'utilisateur prend une image, nous pouvons utiliser la fonction mediastore.images.Media.Insertimage pour ajouter la nouvelle image (via un fichier FilePath) à la galerie du téléphone et générer un contenu: // Style URI. Y a-t-il un processus similaire pour une vidéo capturée, étant donné que nous n'avons que la filepath? P>
5 Réponses :
Je suis également intéressé, pourriez-vous trouver une solution?
Edit: La solution est RTFM. Sur la base du chapitre "Fournisseurs de contenu", mon code qui a fonctionné: P>
// Save the name and description of a video in a ContentValues map. ContentValues values = new ContentValues(2); values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); // values.put(MediaStore.Video.Media.DATA, f.getAbsolutePath()); // Add a new record (identified by uri) without the video, but with the values just set. Uri uri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); // Now get a handle to the file for that record, and save the data into it. try { InputStream is = new FileInputStream(f); OutputStream os = getContentResolver().openOutputStream(uri); byte[] buffer = new byte[4096]; // tweaking this number may increase performance int len; while ((len = is.read(buffer)) != -1){ os.write(buffer, 0, len); } os.flush(); is.close(); os.close(); } catch (Exception e) { Log.e(TAG, "exception while writing video: ", e); } sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
Re: la solution postée. Notez que Java a BufferedInPutStream et BufferedOutPutStream, vous n'avez donc pas à faire cela vous-même.
Que diriez-vous de cela: développeur.android.com/reference/android/media/... < / a>
Si votre application génère une nouvelle vidéo et que vous souhaitez simplement donner aux Metadata quelques métadonnées, vous pouvez créer sur cette fonction: edit strong> : A partir d'Android 4.4 (Kitkat), cette méthode ne fonctionne plus. P> p>
Stackoverflow.com/questions/2114168/...
Oui, l'ensemble du système de stockage / fournisseur de média a été révisé en 4.4. Toute personne ciblant 4.4+ devrait rechercher une solution plus moderne. Fwiw, je ne pense pas que cela justifie un bowvote sur les réponses à cette question de cette année.
Merci de votre réponse et désolé pour le Downvote, mais j'ai passé environ 0,5 heure de ne pas aller nulle part à cause de cette réponse, je pensais qu'il serait bon de sauver ses compresseurs Android de faire de même. J'espère que tu comprends. Je ne pense pas que le ciblage d'une API plus faible ferait une différence ici, car l'équipe Android ne consacrerait à ne pas créer de temps pour créer des mesures de compatibilité pour un comportement sans papiers / non pris en charge qui vient de travailler plus tôt. Supprimerait cette réponse à la restauration de ces points du Downvote? Sinon, je peux alternativement supprimer le bowvote avant le retrait.
Oh, envoyant la diffusion a fonctionné pour moi: Stackoverflow.com/a/14849684/501940
C'est bon d'entendre que vous avez trouvé une solution. J'ai mis à jour le message pour mentionner l'obsolescence à partir de 4.4. La réponse peut être pertinente pour les développeurs qui ciblent des constructions antérieures, cependant, je ne pense pas que cela devrait être supprimé.
J'ai entendu (mais pas encore confirmé) que cette méthode peut être adaptée à 4,4+ en ajoutant un mediastore.video.media.content_type code> la valeur correspondant au type MIME.
Travailler toujours même sur Android P, je me demande pourquoi il est mentionné que cela ne fonctionnerait pas sur 4,4+
Voici une "solution basée sur un fichier unique facile":
Chaque fois que vous getContentResolver().delete(uri, null, null)
La question posée sur l'URI du style de contenu. comment tu l'as obtenu?
Je cherchais à scanner un fichier vidéo. Est-ce que cela fait une différence pour vous?
@Qix Oh .. Eh bien, je viens d'essayer avec des images. Je vais essayer avec la vidéo, mais n'a pas la possibilité de tester maintenant.
Devrait-il être stocké sur un emplacement spécifique avant d'invoquer cela?
Les fichiers Afaik peuvent être situés n'importe où
"Pour la suppression: il suffit d'utiliser getcontentresolver (). Supprimer (UriR, NULL, NULL)" C'est une approche dangereuse qui laisse le fichier multimédia intacte si vous supprimez un fichier multimédia situé sur votre carte SD. Dans ce cas, seuls les informations relatives aux médias STORET seront supprimées de Media Store.
@Eftekhari: "Pour la suppression" doit être lu: "Chaque fois que vous supprimez un fichier, laissez MediaStore Content Fournisseur le sait à propos de". Fera la réponse plus claire.
Essayez ce code. Cela semble travailler pour moi. EXEMPLE DE FILEPATH - P> /storage/emulated/0/DCIM/Camera/VID_20140313_114321.mp4
Ce code renvoie NULL, le nouveau kitkat, Nexus 5. Je suppose que cela fonctionne simplement pour des vidéos déjà dans le magasin multimédia, c'est donc plus utile de ne pas insérer ... vid_20140313_114321 et le chemin suggère que comme c'est le chemin standard et la nommage Pour une application de caméra standard lors de la capture de vidéos.
Je n'ai pas pu obtenir le inent.action_media_freia_filedia_scanner_scan_file code> diffusé pour travailler pour moi sous API 21 (sucette), mais le
mediaScannerConnection code> fonctionne, par exemple:
MediaScannerConnection.scanFile(
context, new String[] { path }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.d(TAG, "Finished scanning " + path + " New row: " + uri);
}
} );
Dupliqué possible de Stackoverflow.com/ Questions / 1925502 / ... . J'ai posté une réponse là-bas.