Android
MediaPlayer
サーチ…
構文
- void setAudioStreamType(int streamtype)
- void setDataSource(コンテキストコンテキスト、URI uri)
- void prepare()
- void prepareAsync()
- void start()
- void stop()
備考
MediaPlayer
使用は、主に状態図に基づいています。
つまり、オーディオ/ビデオを再生するには、定義された一連の動作が特定の順序で行われなければなりません。また、どの状態でどのような行動をとることができるかを述べています 。
MediaPlayer APIには柔軟性がなく(カスタムデコーダとレンダリングロジックが追加されています)、HTTP(DASH)とSmoothStreamingを介した動的アダプティブストリーミングのサポートがありません。これらについては、 ExoPlayerを見てください 。
基本的な作成と再生
MediaPlayerクラスは、オーディオ/ビデオファイルとストリームの再生を制御するために使用できます。
MediaPlayerオブジェクトの作成には、次の3つのタイプがあります。
ローカルリソースからのメディア
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource); mediaPlayer.start(); // no need to call prepare(); create() does that for you
ローカルURIから(ContentResolverから取得)
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
外部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
}
});
システム着メロを取得する
この例では、システム着信音のURI( RingtoneManager.TYPE_RINGTONE
)を取得する方法を示します。
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を取得するには、すべてのUri
RingtoneManager
で解決する必要があります。
android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);
サウンドを再生するには、次の方法を使用します。
public void setDataSource(Context context, Uri uri)
android.media.MediaPlayer
から。 MediaPlayer
は、 状態図に従って初期化して準備する必要があります
システムボリュームの取得と設定
オーディオストリームの種類
着信音ストリームのさまざまなプロファイルがあります。それぞれの音量はそれぞれ違っています。
ここのすべての例は、 AudioManager.STREAM_RING
ストリームタイプのために書かれて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);
これらの2つの値の比は、相対体積(0 <体積<1)を与える。
float volume = ((float) currentVolume) / streamMaxVolume
1ステップで音量を調整する
ストリームの音量を1ステップ高くするには、次のように呼び出します。
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);
ストリームの音量を1ステップ下げるには、次のように呼び出します。
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);
特定のストリームタイプを使用するようにMediaPlayerを設定する
これを行うには、 MediaPlayer
クラスのヘルパー関数があります。
ちょうどvoid setAudioStreamType(int streamtype)
呼び出してvoid setAudioStreamType(int streamtype)
:
MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);
バッファの進行と再生位置を持つMedia Player
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();
}
});
}
}