2

это намерение, которое открывает Chooser из музыкального приложенияAndroid - Как создать MediaPlayer от выбранного пользователя песни

public void launchMusicPlayer(View view) { 
     Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(i,1); 
    } 

и ниже код onActivityResult, чтобы попытаться получить песню , но проблема в том, что кнопка тестирования при нажатии, не воспроизводит ничего и, поскольку я новичок в кодировании, я не знаю, что я делаю неправильно.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK && requestCode == 1) { 
     final MediaPlayer testSong = new MediaPlayer(); 
     Uri songUri = data.getData(); 

      try { 
       testSong.setDataSource(this, songUri); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     testSong.prepareAsync(); 

     test.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       testSong.start(); 
      } 
     }); 
    } 
} 

ответ

1

Проблема может быть, потому, что prepareAsync() является асинхронным, поэтому MediaPlayer могут быть не готовы, когда вы звоните start(). Есть 2 способа исправить это:

  1. Использование prepare() вместо prepareAsync()

    test.setOnClickListener(new View.OnClickListener() { 
    
        @Override 
        public void onClick(View v) { 
         testSong.prepare(); 
         testSong.start(); 
        } 
    }); 
    
  2. вызов start() метод внутри setOnPreparedListener()

    test.setOnClickListener(new View.OnClickListener() { 
    
        @Override 
        public void onClick(View v) { 
         testSong.prepareAsync(); 
         testSong.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    
          @Override 
          public void onPrepared(MediaPlayer player) { 
           player.start(); 
          } 
         } 
    }); 
    

Обратитесь к документации здесь http://developer.android.com/reference/android/media/MediaPlayer.html

+0

Спасибо. Я пробовал ваш метод, но все тот же вопрос. Поэтому я сделал onClickListener для кнопки в onCreate активности, чтобы воспроизвести определенную песню из необработанной папки, и это работает. Но если я выберу песню из избранного, то нажмите кнопку тестирования, она все еще воспроизводит песню из исходной папки, означая, что она даже не читает onActivityResult, так что мне делать? @Tony Vu ​​ –

+0

О, это будет другая проблема с вашего оригинального сообщения. Во всяком случае, я думаю, проблема в том, что Uri возвращен data.getData(). Может потребоваться некоторая обработка, прежде чем перейти к setDataSource(). Вы можете попробовать методы, рекомендованные в этом потоке. Http://stackoverflow.com/questions/17042308/select-a-music-file-to-play-with-mediaplayer –

+0

Спасибо @ Тони Ву. Я получил его для работы с последний ответ в этом вопросе –