수색…


통사론

  • void setAudioStreamType (int streamtype)
  • void setDataSource (컨텍스트 컨텍스트, Uri uri)
  • void prepare ()
  • void prepareAsync ()
  • void start ()
  • void stop ()

비고

MediaPlayer 사용은 주로 State 다이어그램을 기반으로합니다.

여기에 이미지 설명을 입력하십시오.

즉, 오디오 / 비디오를 재생하려면 정의 된 순서의 액션이 특정 순서로 발생해야합니다. 또한 어떤 상태에서 어떤 행동을 취할 수 있는지도 명시합니다.

MediaPlayer API에는 융통성이 없으므로 (맞춤 디코더 및 렌더링 논리 추가) HTTP (DASH) 및 SmoothStreaming을 통한 동적 적응 형 스트리밍을위한 sSupport가 부족합니다. 이를 위해 ExoPlayer를 살펴보십시오.

기본 생성 및 재생

MediaPlayer 클래스는 오디오 / 비디오 파일 및 스트림의 재생을 제어하는 ​​데 사용할 수 있습니다.

MediaPlayer 객체의 생성은 세 가지 유형이 될 수 있습니다.

  1. 로컬 리소스의 미디어

    MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource);
    mediaPlayer.start(); // no need to call prepare(); create() does that for you
    
  2. 로컬 URI (ContentResolver에서 가져옴)

    Uri myUri = ....; // initialize Uri here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(getApplicationContext(), myUri);
    mediaPlayer.prepare();
    mediaPlayer.start();
    
  3. 외부 URL에서

    String url = "http://........"; // your URL here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(url);
    mediaPlayer.prepare(); // might take long! (for buffering, etc)
    mediaPlayer.start();
    

비동기식 준비

MediaPlayer$prepare() 는 블로킹 호출이며 실행이 완료 될 때까지 UI를 고정시킵니다. 이 문제를 해결하기 위해 MediaPlayer$prepareAsync() 사용할 수 있습니다.

mMediaPlayer = ... // Initialize it here
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer player) {
        // Called when the MediaPlayer is ready to play
        mMediaPlayer.start();
    }
}); // Set callback for when prepareAsync() finishes
mMediaPlayer.prepareAsync(); // Prepare asynchronously to not block the Main Thread

동기 연산에서 오류는 일반적으로 예외 또는 오류 코드와 함께 신호를 받지만 비동기 자원을 사용할 때마다 응용 프로그램에 오류가 적절하게 통지되는지 확인해야합니다. MediaPlayer의 경우,

mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener(){
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            // ... react appropriately ...
            // The MediaPlayer has moved to the Error state, must be reset!
            // Then return true if the error has been handled
        }
});

시스템 벨소리 받기

이 예제는 시스템 벨소리 ( RingtoneManager.TYPE_RINGTONE )의 URI를 가져 오는 방법을 보여줍니다.

private List<Uri> loadLocalRingtonesUris() {
        List<Uri> alarms = new ArrayList<>();
        try {
            RingtoneManager ringtoneMgr = new RingtoneManager(getActivity());
            ringtoneMgr.setType(RingtoneManager.TYPE_RINGTONE);

            Cursor alarmsCursor = ringtoneMgr.getCursor();
            int alarmsCount = alarmsCursor.getCount();
            if (alarmsCount == 0 && !alarmsCursor.moveToFirst()) {
                alarmsCursor.close();
                return null;
            }

            while (!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
                int currentPosition = alarmsCursor.getPosition();
                alarms.add(ringtoneMgr.getRingtoneUri(currentPosition));
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return alarms;
    }

이 목록은 요청 된 벨소리 유형에 따라 다릅니다. 가능성은 다음과 같습니다.

  • RingtoneManager.TYPE_RINGTONE
  • RingtoneManager.TYPE_NOTIFICATION
  • RingtoneManager.TYPE_ALARM
  • RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM


android.media.Ringtone Ringtones를 얻으려면 모든 UriRingtoneManager 해결해야합니다.

android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);

사운드를 재생하려면 다음 방법을 사용하십시오.

public void setDataSource(Context context, Uri uri)

android.media.MediaPlayer . MediaPlayerState 다이어그램 에 따라 초기화되고 준비되어야합니다.

시스템 볼륨 가져 오기 및 설정

오디오 스트림 유형

벨소리 스트림의 다양한 프로필이 있습니다. 그들 각각은 다른 볼륨을 가지고 있습니다.

여기에있는 모든 예제는 AudioManager.STREAM_RING 스트림 유형 용으로 작성되었습니다. 그러나 이것은 유일한 것이 아닙니다. 사용 가능한 스트림 유형은 다음과 같습니다.

  • STREAM_ALARM
  • STREAM_DTMF
  • STREAM_MUSIC
  • STREAM_NOTIFICATION
  • STREAM_RING
  • STREAM_SYSTEM
  • STREAM_VOICE_CALL


볼륨 설정

특정 프로필의 볼륨을 얻으려면 다음을 호출하십시오.

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);

스트림의 최대 값을 알 수없는 경우이 값은 거의 유용하지 않습니다.

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

이 두 값의 비율은 상대 볼륨 (0 <볼륨 <1)을 제공합니다.

float volume = ((float) currentVolume) / streamMaxVolume


한 단계 씩 볼륨 조절

스트림의 볼륨을 한 단계 더 높이려면 다음을 호출하십시오.

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);

스트림의 볼륨을 한 단계 낮추려면 다음을 호출하십시오.

AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);


특정 스트림 유형을 사용하도록 MediaPlayer 설정하기

이 작업을 수행하는 MediaPlayer 클래스의 도우미 함수가 있습니다.
그냥 void setAudioStreamType(int streamtype) 호출 :

MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);

버퍼 진행 및 재생 위치가있는 미디어 플레이어

public class SoundActivity extends Activity  {
 
    private MediaPlayer mediaPlayer;
    ProgressBar progress_bar;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tool_sound);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        progress_bar = (ProgressBar) findViewById(R.id.progress_bar);
   
        btn_play_stop.setEnabled(false);
        btn_play_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                    btn_play_stop.setImageResource(R.drawable.ic_pause_black_24dp);
                } else {
                    mediaPlayer.start();
                    btn_play_stop.setImageResource(R.drawable.ic_play_arrow_black_24px);
                }
            }
        });

        mediaPlayer.setDataSource(proxyUrl);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                observer.stop();
                progress_bar.setProgress(mp.getCurrentPosition());
                // TODO Auto-generated method stub
                mediaPlayer.stop();
                mediaPlayer.reset();
            }
        });
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                progress_bar.setSecondaryProgress(percent);
            }
        });
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                btn_play_stop.setEnabled(true);

            }
        });
        observer = new MediaObserver();
        mediaPlayer.prepare();
        mediaPlayer.start();
        new Thread(observer).start();
    }

   
    private MediaObserver observer = null;

    private class MediaObserver implements Runnable {
        private AtomicBoolean stop = new AtomicBoolean(false);

        public void stop() {
            stop.set(true);
        }

        @Override
        public void run() {
            while (!stop.get()) {
                progress_bar.setProgress((int)((double)mediaPlayer.getCurrentPosition() / (double)mediaPlayer.getDuration()*100));
                try {
                    Thread.sleep(200);
                } catch (Exception ex) {
                    Logger.log(ToolSoundActivity.this, ex);
                }

            }
        }
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mediaPlayer.stop();
    }
}

<LinearLayout
    android:gravity="bottom"
    android:layout_gravity="bottom"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:weightSum="1">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageButton
            app:srcCompat="@drawable/ic_play_arrow_black_24px"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/btn_play_stop" />

        <ProgressBar
            android:padding="8dp"
            android:progress="0"
            android:id="@+id/progress_bar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

    </LinearLayout>

</LinearLayout>

androidstudio로 오디오 가져 오기 및 재생

이것은 당신이 이미 당신의 PC / 랩톱에 가지고있는 오디오 파일을 재생하는 방법을 보여주는 예제입니다. 먼저 res 아래에 새로운 디렉토리를 생성하고 이것을 다음과 같이 원시 파일로 만듭니다

이

이 폴더에 재생할 오디오를 복사하십시오. .mp3 또는 .wav 파일 일 수 있습니다.

예를 들어 버튼 클릭에 대해이 사운드를 재생하려면 여기를 클릭하십시오.

public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.aboutapp_activity);

    MediaPlayer song=MediaPlayer.create(this, R.raw.song);

    Button button=(Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           song.start();
        }
    });
}
}

이렇게하면 버튼을 클릭 할 때 한 번만 노래가 재생됩니다. 모든 버튼에서 노래를 재생하려면 다음과 같이 코드를 작성하십시오.

 public class MainActivity extends AppCompatActivity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.aboutapp_activity);

   MediaPlayer song=MediaPlayer.create(this, R.raw.song);

   Button button=(Button)findViewById(R.id.button);
   button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (song.isPlaying()) {
            song.reset();
            song= MediaPlayer.create(getApplicationContext(), R.raw.song);
       }
         song.start();
     }
   });
 }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow