Comment obtenir des chansons de l'album/Artiste en android,en utilisant MediametadataRetriever?
Tout d'abord, je suis un newbie et d'autre part je sais qu'il existe une solution pour les "Comment obtenir des chansons de l'album dans android?", mais c'est à l'aide du curseur et MediaStore et je l'ai utilisé MediametadataRetriever et son totalement différent, je n'ai pas utilisé hashmaps et tout et tout.....donc sa devient un peu difficile....merci de toutes les solutions pour cette???sans l'aide de hashmaps et mediastore???
voici le code que j'ai utilisé pour afficher toutes les chansons et ses artistes ..........
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class FragmentSongs extends Fragment implements Serializable {
AdapterView.AdapterContextMenuInfo info;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_song, container, false);
ListView SngList = (ListView) view.findViewById(R.id.SongList);
registerForContextMenu(SngList);
File f=new File("/sdcard/Music");
int j=0;int i=0;
final ArrayList<SongDetails> Songinfo = getSongsFromDirectory(f);
if (Songinfo.size()>0) {
for( j=0; j<Songinfo.size();j++) {
for ( i=j+1 ; i<Songinfo.size(); i++) {
SongDetails a=Songinfo.get(i);
SongDetails b=Songinfo.get(j);
if (a.getSong().toLowerCase().compareTo(b.getSong().toLowerCase()) < 0) {
Songinfo.set(i,b );
Songinfo.set(j,a);
}
}
}
SngList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView a, View v, int position, long id) {
Intent intent = new Intent(getActivity(), NowPlaying.class);
intent.putParcelableArrayListExtra("Data1",Songinfo);
intent.putExtra("Data2",position);
startActivity(intent);
}
});
SngList.setAdapter(new CustomAdapter(Songinfo));
return view;
} else {
return null;
}
}
public ArrayList<SongDetails> getSongsFromDirectory(File f) {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
ArrayList<SongDetails> songs = new ArrayList<SongDetails>();
Bitmap bitmap2;
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ab);
float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Bitmap bitmap3 = Bitmap.createScaledBitmap(bmp, (int) ht_px, (int) wt_px, true);
byte[] rawArt = null;
Bitmap art;
BitmapFactory.Options bfo=new BitmapFactory.Options();
if (!f.exists() || !f.isDirectory()) {
return songs;
}
File[] files = f.listFiles(new Mp3Filter());
for(int i=0; i<files.length; i++) {
if (files[i].isFile()) {
mmr.setDataSource(files[i].getPath());
rawArt = mmr.getEmbeddedPicture();
SongDetails detail=new SongDetails();
if ( rawArt != null) {
bitmap2=BitmapFactory.decodeByteArray(rawArt, 0, rawArt.length, bfo);
bitmap2 = Bitmap.createScaledBitmap(bitmap2, (int) ht_px, (int) wt_px, true);
detail.setIcon(bitmap2);
} else {
detail.setIcon(bitmap3);
}
detail.setSong(files[i].getName());
detail.setArtist(files[i].getName());
detail.setArtist( mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
detail.setAlbum( mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
detail.setPath2( files[i].getPath()) ;
songs.add(detail);
} else if (files[i].isDirectory()) {
songs.addAll(getSongsFromDirectory(files[i]));
}
}
return songs;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
info = (AdapterContextMenuInfo) menuInfo;
menu.add(Menu.NONE, v.getId(), 0, "Play");
menu.add(Menu.NONE, v.getId(), 0, "Delete");
menu.add(Menu.NONE, v.getId(), 0, "Queue Item");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getTitle() == "Play") {
} else if (item.getTitle() == "Delete") {
} else if (item.getTitle() == "Queue Item") {
} else {
return false;
}
return true;
}
}
class Mp3Filter implements FileFilter {
public boolean accept(File file) {
return (file.isDirectory()||file.getName().endsWith(".mp3")|| file.getName().endsWith(".Mp3"));
}
}
Merci de ne nettoyer les sauts de ligne, l'indentation et {} de votre code. Actuellement, il est très difficile à lire. Veuillez également indiquer où dans le code de votre problème.
Eh bien il n'y a pas de problème dans le code......j'ai posté ce code pour ceux qui disent "où est le code que vous utilisez"ce que je fais c'est que je suis à la recherche de tous les fichiers, puis en affichant les chansons et leurs pochettes d'album , d'artiste et d'albums dans une liste personnalisée..il n'y a pas eu de problème jusqu'à maintenant...le code fonctionne très bien....mais je ne sais pas comment faire pour afficher toutes les chansons d'un artiste ou d'un album......je ne veux pas être l'aide de la chaîne de tri et de tous parce qu'il va faire mon code très lourd ....
Donc, si il n'y a pas des problèmes avec le code, vérifiez disponible exemples et de les utiliser pour créer ce que vous voulez.
Pouvez-vous me fournir un tel exemple?
Eh bien il n'y a pas de problème dans le code......j'ai posté ce code pour ceux qui disent "où est le code que vous utilisez"ce que je fais c'est que je suis à la recherche de tous les fichiers, puis en affichant les chansons et leurs pochettes d'album , d'artiste et d'albums dans une liste personnalisée..il n'y a pas eu de problème jusqu'à maintenant...le code fonctionne très bien....mais je ne sais pas comment faire pour afficher toutes les chansons d'un artiste ou d'un album......je ne veux pas être l'aide de la chaîne de tri et de tous parce qu'il va faire mon code très lourd ....
Donc, si il n'y a pas des problèmes avec le code, vérifiez disponible exemples et de les utiliser pour créer ce que vous voulez.
Pouvez-vous me fournir un tel exemple?
OriginalL'auteur Ankit Srivastava | 2013-08-10
Vous devez vous connecter pour publier un commentaire.
Découvrez ce tutoriel:
http://www.srikanthtechnologies.com/blog/android/audioplayer.aspx
Vous pouvez le modifier légèrement pour répondre à vos besoins:
De l'image (pochette) de la manipulation, il devrait vraiment être fait de manière asynchrone dans l'adaptateur. Je vous suggère de l'aide Image Universelle De Chargeur.
Mise à jour:
Viens de voir vos commentaires. Ce que vous voulez vraiment est un moyen efficace de liste des chansons à partir d'un album ou de l'artiste, sans l'aide de filtres de fichiers et de tri. La seule autre option est d'utiliser
MediaStore
/Cursor
. Il existe différents types de requêtes que vous pouvez construire, selon la façon dont vous essayez d'afficher les données.Ainsi, pour une requête pour une liste de l'artiste, vous pouvez utiliser
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI
et utiliser le nom de l'artiste comme votre sélection args.Pour la liste des albums, vous avez maintenant la
ARTIST_KEY
que vous pouvez utiliser pour interrogerMediaStore.Audio.Artists.Albums.EXTERNAL_CONTENT_URI
, pour obtenir une liste des albums de l'artiste.Pour un exemple de liste de tous les albums d'un artiste donné, voir ici.
Oui, j'ai donné un exemple et un lien. Vous avez 2 options: l'utilisation des Fichiers et de gérer le tri/filtrage de vous-même, ou l'utilisation MediaStore. Il n'y a pas d'autres options.
Bien dans l'e.g le filtrage n'est pas mis en œuvre
"Lol parce que j'ai pris le temps de développer ma propre code" -- Pire raison, jamais! Dans le temps, vous vous habituerez à la mise au rebut de gros morceaux de code. Finalement, il se sent bien. "Le code prend trop de temps à charger" -- à l'Aide de MediaStore/Curseurs est beaucoup, beaucoup plus rapide. Beaucoup Plus Rapide. "est l'analyse de xml plus facile que json" -- Non, mais Android a largement optimisé parseurs XML (SAXParser, XMLPullParser). Certainement pas la peine de convertir json en xml. Découvrez Gson.
eh bien, puisque il n'y a pas d'autres options ...soit j'ai utiliser mediastore ou à développer mon propre code....je pense que u méritent le bounty,désolé si j'avais été impoli plus tôt
OriginalL'auteur Paul Burke
@Anknit Mediastore ne la détecte pas tous les répertoires de votre appareil.
Je n'est il analyse beaucoup plus rapide que ce que nous essayons de construire notre propre code.
Mais il ne pas détecter certains dossiers. Aujourd'hui, je suis entrain de créer mon projet dans mon téléphone, j'ai des répertoires à savoir .corbeille-100 & .corbeille il contient presque .les fichiers mp3.
Il n'avait pas été détecté par la même VLC et par défaut du lecteur de musique à l'exception de l'Amplificateur.
Veuillez consulter le lien suivant
http://mrbool.com/how-to-extract-meta-data-from-media-file-in-android/28130
Je viens d'utiliser la récursivité, et il a bien fonctionné
OriginalL'auteur Akshay Mukadam