2017-07-13 3 views
0

okay donc j'essaie d'afficher des pochettes d'album pour les chansons dans mon application. J'essaie de le faire en utilisant Mediametadataretriever. Mais je reçois une IllegalStateException à la ligne metaRetriver.setDataSource(Environment.getExternalStorageDirectory().getPath());
Je comprends que cela puisse être dû à l'utilisation d'un chemin invalide, mais je ne peux pas comprendre quel est le chemin valide alors. Je suis vraiment novice pour le développement d'applications Android. Est-ce que quelqu'un peut m'aider ?afficher la pochette de l'album en utilisant mediametadataretriever

PlayListActivity.java:

package com.example.dell_1.myapp3; 


import android.app.Activity; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Color; 
import android.media.MediaMetadataRetriever; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 

import java.io.IOException; 

public class PlayListActivity extends Activity { 

    private String[] mAudioPath; 
    private MediaPlayer mMediaPlayer; 
    private String[] mMusicList; 

    MediaMetadataRetriever metaRetriver; 
    byte[] art; 
    ImageView album_art; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_play_list); 

     mMediaPlayer = new MediaPlayer(); 
     ListView mListView = (ListView) findViewById(R.id.list); 

     mMusicList = getAudioList(); 

     ArrayAdapter<String> mAdapter = new ArrayAdapter<>(this, 
       android.R.layout.simple_list_item_1, mMusicList); 
     mListView.setAdapter(mAdapter); 

     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View view, int arg2, 
            long arg3) { 

       try { 
        playSong(mAudioPath[arg2]); 
       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 
    } 

    private String[] getAudioList() { 
     final Cursor mCursor = getContentResolver().query(
       MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
       new String[]{MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA}, null, null, 
       "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC"); 

     int count = mCursor.getCount(); 

     String[] songs = new String[count]; 
     mAudioPath = new String[count]; 
     int i = 0; 
     if (mCursor.moveToFirst()) { 
      do { 
       songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); 
       mAudioPath[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
       i++; 
      } while (mCursor.moveToNext()); 
     } 

     mCursor.close(); 

     return songs; 
    } 


    private void playSong(String path) throws IllegalArgumentException, 
      IllegalStateException, IOException { 

     setContentView(R.layout.activity_android_building_music_player); 
     Log.d("ringtone", "playSong :: " + path); 

     mMediaPlayer.reset(); 
     mMediaPlayer.setDataSource(path); 
//mMediaPlayer.setLooping(true); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
     acv(); 
    } 

    public void acv() { 
     getInit(); 

     metaRetriver = new MediaMetadataRetriever(); 
     metaRetriver.setDataSource(Environment.getExternalStorageDirectory().getPath()); 
     try { 
      art = metaRetriver.getEmbeddedPicture(); 
      Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length); 
      album_art.setImageBitmap(songImage); 
     } catch (Exception e) { 
      album_art.setBackgroundColor(Color.GRAY); 

     } 

    } 

    public void getInit() { 
     album_art = (ImageView) findViewById(R.id.coverart); 

    } 
} 

activity_play_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <ListView 
     android:id="@+id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:divider="#242424" 
     android:dividerHeight="1dp" 
     android:listSelector="@drawable/list_selector" /> 

</LinearLayout> 

activity_android_building_music_player.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <LinearLayout 
     android:id="@+id/player_header_bg" 
     android:layout_width="fill_parent" 
     android:layout_height="60dip" 
     android:layout_alignParentTop="true" 
     android:background="@layout/bg_player_header" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp"> 

     <TextView 
      android:id="@+id/songTitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:layout_weight="1" 
      android:paddingLeft="50dp" 
      android:text="The Good" 
      android:textColor="#04b3d2" 
      android:textSize="16dp" 
      android:textStyle="bold" /> 

     <ImageButton 
      android:id="@+id/btnPlaylist" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:background="@null" 
      android:src="@drawable/btn_playlist" /> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/songThumbnail" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/player_header_bg" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:gravity="center" 
     android:paddingBottom="10dp" 
     android:paddingTop="10dp"> 

     <ImageView 
      android:id="@+id/coverart" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      /> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/player_footer_bg" 
     android:layout_width="fill_parent" 
     android:layout_height="100dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:background="@layout/bg_player_footer" 
     android:gravity="center"> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="center_vertical" 
      android:orientation="horizontal" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:weightSum="1"> 
      <RelativeLayout 
       android:layout_width="300dp" 
       android:layout_height="match_parent"> 
       <ImageButton 
        android:id="@+id/btnPrevious" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_weight="2.40" 
        android:layout_alignParentLeft="true" 
        android:paddingLeft="10dp" 
        android:background="@null" 
        android:src="@drawable/btn_previous" /> 

       <ImageButton 
        android:id="@+id/btnPlay1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerInParent="true" 
        android:background="@null" 
        android:src="@drawable/btn_play" 
        android:onClick="buttonAction1"/> 


       <ImageButton 
        android:id="@+id/btnNext" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:paddingLeft="250dp" 
        android:background="@null" 
        android:src="@drawable/btn_next" /> 
      </RelativeLayout> 
     </LinearLayout> 
    </LinearLayout> 

    <SeekBar 
     android:id="@+id/songProgressBar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/player_footer_bg" 
     android:layout_alignLeft="@+id/timerDisplay" 
     android:layout_alignStart="@+id/timerDisplay" 
     android:layout_marginBottom="10dp" 
     android:paddingLeft="6dp" 
     android:paddingRight="6dp" 
     android:progressDrawable="@drawable/seekbar_progress" 
     android:thumb="@drawable/download8" /> 

    <LinearLayout 
     android:id="@+id/timerDisplay" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@id/songProgressBar" 
     android:layout_marginBottom="10dp" 
     android:layout_marginLeft="20dp" 
     android:layout_marginRight="20dp"> 

     <TextView 
      android:id="@+id/songCurrentDurationLabel" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="left" 
      android:textColor="#eeeeee" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/songTotalDurationLabel" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="right" 
      android:textColor="#04cbde" 
      android:textStyle="bold" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@id/timerDisplay" 
     android:gravity="center"> 

     <ImageButton 
      android:id="@+id/btnRepeat" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="5dp" 
      android:background="@null" 
      android:src="@drawable/btn_repeat" /> 

     <ImageButton 
      android:id="@+id/btnShuffle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="5dp" 
      android:background="@null" 
      android:src="@drawable/btn_shuffle" /> 
    </LinearLayout> 
</RelativeLayout> 

Répondre

0

En fait, vous jouez quelques uns dans un chemin de fichier et que vous essayez d'aller chercher l'art du chemin du fichier de stockage externe, de sorte que vous devez envoyer le chemin à cette méthode,

private void playSong(String path) throws IllegalArgumentException, 
      IllegalStateException, IOException { 

     setContentView(R.layout.activity_android_building_music_player); 
     Log.d("ringtone", "playSong :: " + path); 

     mMediaPlayer.reset(); 
     mMediaPlayer.setDataSource(path); 
//mMediaPlayer.setLooping(true); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
     acv(path); 
    } 

    public void acv(String path) { 
     getInit(); 

     metaRetriver = new MediaMetadataRetriever(); 
     metaRetriver.setDataSource(path); 
     try { 
      art = metaRetriver.getEmbeddedPicture(); 
      Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length); 
      album_art.setImageBitmap(songImage); 
     } catch (Exception e) { 
      album_art.setBackgroundColor(Color.GRAY); 

     } 

    } 

Et quelques suggestions,

  • Vous ne devez pas utiliser setContentView plusieurs fois dans une activité Je comprends que vous utilisez 2 dispositions, mais dans ce cas, vous devez utiliser 2 activités différentes.
  • Vous jouer quelque chose chansons et l'utilisateur ne sera pas dans votre application toujours qu'ils aiment déplacer l'application alors essayez d'utiliser le service pour exécuter la chanson en arrière-plan

Pour plus d'information, vous pouvez obtenir l'application opensource fantastique sera disponible dans Github regarder dans cela.

+0

Merci, son travail et merci pour vos suggestions, je vais travailler sur eux. merci beaucoup vraiment :) –

0

Eh bien, vous essayez d'obtenir une vignette à partir d'un fichier spécifique, mais vous mettez dans le chemin du répertoire de stockage externe. Donc, en utilisant

metaRetriver.setDataSource(Environment.getExternalStorageDirectory().getPath()); 

Vous pointez vers un dossier, pas un fichier multimédia spécifique. Mais ceci:

metaRetriver.setDataSource(Environment.getExternalStorageDirectory().getPath() + "yourFileName.mp3"); 

Est plus en ligne avec ce que vous auriez besoin.

+0

merci mais si je veux le faire pour tous les fichiers audio stockés dans un stockage externe ?? –

+0

Vous auriez à le faire pour chaque fichier. Donc, quand vous récupérez ce chemin de fichier pour la chanson particulière à jouer, passez-le à la fonction acv de la vôtre et utilisez simplement metaRetriver.setDataSource (songPath) – Devsil