0

raw ディレクトリに 2 つの MP3 ファイルがあります。

ボタンを押すと、2 つの mp3 ファイルのいずれかがランダムに選択されて再生が開始され、曲のメタ情報 (アーティストとタイトル) が表示されます。しかし、もう一度ボタンを押して別の曲の再生を開始すると、メタデータは (最初の曲の) ままです。曲が変わっても変わらない。これが私のコードです:

public class MainActivity extends Activity {

Button playList_Black;
TextView textView;
MediaPlayer mp;
ImageView cover;
Random r = new Random();

int [] playlist_Black    = {R.raw.music_a, R.raw.music_b};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    playList_Black    = (Button)findViewById(R.id.btn_black);
    textView = (TextView)findViewById(R.id.textView1);
    cover = (ImageView)findViewById(R.id.imageView1);
}

@SuppressLint("NewApi")
protected String loadMp3DataFile(int i, Context context) {

    String mp3_parameter;

    String uriPath = "android.resource://" + getPackageName() + "/raw/" + 
                      getResources().getResourceEntryName(i);
    Uri uri = Uri.parse(uriPath);

    // load data file
    MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
    metaRetriever.setDataSource(context, uri);
    String artist =  metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
    Log.e("artist2: ", artist);
    String title  = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
    byte[] songCover = metaRetriever.getEmbeddedPicture();

    if(songCover != null) {
        cover.setImageBitmap(BitmapFactory.decodeByteArray(songCover, 0, songCover.length));
    }
    else {
        cover.setImageResource(R.drawable.ic_launcher);
    }

    //return parameter
    mp3_parameter = (artist + "\n" + title);

    // close object
    metaRetriever.release();

    return mp3_parameter;
}

public void PlayMusic(int playlist) {

    if(mp != null) {
        if(mp.isPlaying()){
        mp.stop();
        mp.reset();
        mp = MediaPlayer.create(getApplicationContext(), playlist);
        try {
            mp.prepare();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mp.start();
        }
        else if(mp.isPlaying() == false) {
            mp = MediaPlayer.create(getApplicationContext(), playlist);
            mp.start();
        }
    }
    else {
    mp = MediaPlayer.create(getApplicationContext(), playlist);
    mp.start();
    }
}

public void PlaylistBlack(View v) {

    int i = playlist_Black[r.nextInt(playlist_Black.length)];
    textView.setText(loadMp3DataFile(i, getApplicationContext()));
    Log.e("Ausgabe: ", "" + i); 
    Log.e("Ausgabe: ", "" + getResources().getResourceEntryName(i));    
    PlayMusic(i);
}

私は何を間違っていますか?解決策とアドバイスはありますか?前もって感謝します。

4

1 に答える 1

0

コードは正しく、エミュレーターで正常に動作します。しかし、スマートフォンでプロジェクトを実行すると、上記の問題が発生します。曲の同じメタ情報のみを表示します。スマートフォンで動作させるための解決策はありますか?

于 2013-03-13T08:13:47.893 に答える