Android マルチメディア MediaPlayerの使用方法詳細
今でこそ、携帯電話はどんどんリッチになっていますが、10年前はMP3、MP4、MP5、が大人気で、ブログ主も高校生になり、音楽を聴いたり、映画を見たりするために一台欲しいなと思っていました。しかし、条件が限られている、学校もこの事を禁止しているので、密かに遊ぶだけ。Andriodシステムに搭載されているMediaplayerとVideoViewを使って簡単な音楽・動画再生を実現し、Kugou Musicのようなアプリも作りたい、やろうと思えば難しくないはずです。Kugou Musicのようなアプリを作るのは、やろうと思えば難しいことではないはずで、これをベースに機能の拡張を実現しています。
AndroidのMediaPlayerには、AudioとVideoの再生機能があり、MusicアプリもVideoアプリもAndroidのインターフェースでMediaPlaerを呼び出して行っています。
<スパン I. オーディオファイルの再生
MediaPlaerのライフサイクルを初めて見る
以下は、MediaPlayerが提供する一般的なメソッドです。
<テーブル メソッド 説明 メディアプレーヤー コンストラクトメソッド 作成 再生するマルチメディアを作成する getCurrentPosition 現在の再生位置を取得する 取得期間 ファイルのデュレーションを取得する ゲットビデオハイト 動画の高さを取得する ビデオ幅 動画の幅を取得する isLooping ループさせるかどうか isPlaying IsPlaying ポーズ ポーズ 用意する プリペア(シンクロナイズ) prepareAsync 準備(非同期) リリース MediaPlayer オブジェクトに関連付けられたリソースを解放する。 リセット MediaPlayerオブジェクトを生成されたばかりの状態にリセットする シークトゥ 再生する場所を指定する(ミリ秒単位の時間指定) setAudioStreamType ストリーミングメディアの種類を設定する setDataSource マルチメディアのデータソース(場所)を設定する setDisplay マルチメディアを表示するためのSurfaceHolderを設定する setLooping ループさせるかどうかを設定する setOnButteringUpdateListener ネットワークストリーミングのバッファリングリスナー setOnErrorListener エラーメッセージのリスナーを設定する setOnVideoSizeChangedListener 動画サイズリスナー setScreenOnWhilePlaying SurfaceHolderを使用して画面を表示したままにするかどうかを設定する セットボリューム ボリュームを設定する 開始 再生開始 停止 再生の停止
MediaPlayerのワークフローは次のようになります。
1、まずMediaPlaerオブジェクトを作成します。
2、次にsetDataSource()メソッドを呼び出し、音声ファイルのパスを設定します。 **
3、次にprepare()メソッドを呼び出し、MediaPlayerを準備完了状態にする。
4、startメソッドを呼び出して音声を再生します。
* MediaPlaerオブジェクトを作成するには、次の2つの方法があります。
a 直接的に新規作成する
MediaPlayer mp = new MediaPlayer();
b createメソッドを使用する
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//this time there is no need to call setDataSource
もちろん、上記でまず必要なのは、resフォルダ内にrawフォルダを新規作成し、テストファイルを配置することです
** 再生するファイルを設定する
MediaPlayerで再生されるファイルには、主に3つのソースがあります。
a. あらかじめアプリ内のユーザー自身のリソース
例えば MediaPlayer.create(this, R.raw.test);
b. SDカードやその他のファイルパスに保存されているメディアファイル
例: mp.setDataSource("/sdcard/test.mp3");
c. ネットワーク上のメディアファイル
例:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3")。
MediaPlayerのsetDataSourceには4つのメソッドがあります。
setDataSource (文字列パス)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, 長いオフセット, 長い長さ)
FileDescriptorを使用する場所では、resフォルダと同じ階層のassetsフォルダにファイルを置いてから使用する必要があります。
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength()));
データソースを設定する
まずは簡単に結果を見てみましょう。
上記の機能を一目でわかるようにするためには、言わずもがな
以下は実装コードです。
アクティビティ_メイン.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="play" />
<Button
android:id="@+id/pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="pause" />
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="stop" />
</LinearLayout>
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="0"
android:progress="0"
android:secondaryProgress="0" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id
MainActivity.java
package com.example.musicplayer;
import java.io.File;
import java.io.IOException;
import android.R.integer;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget;
import android.widget.SeekBar;
OnSeekBarChangeListener; import android.widget.SeekBar;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener,
OnSeekBarChangeListener {
private Button play, pause, stop;
private MediaPlayer player;
private SeekBar mSeekBar;
private TextView tv, tv2;
private boolean hadDestroy = false;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0x01:
break;
default:
break;
}
};
};
Runnable runnable = new Runnable() {
@Override
public void run() {
if (!hadDestroy) {
mHandler.postDelayed(this, 1000);
int currentTime = Math
.round(player.getCurrentPosition() / 1000);
String currentStr = String.format("%s%02d:%02d", "currentTime ",
currentTime / 60, currentTime % 60);
tv.setText(currentStr);
mSeekBar.setProgress(player.getCurrentPosition());
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (Button) findViewById(R.id.play);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
mSeekBar = (SeekBar) findViewById(R.id.seekbar). mSeekBar = (SeekBar) findViewById(R.id.seekbar);
tv = (TextView) findViewById(R.id.tv);
tv2 = (TextView) findViewById(R.id.tv2). tv2 = (TextView) findViewById(R.id.tv2);
mSeekBar.setOnSeekBarChangeListener(this);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
player = new MediaPlayer();
initMediaplayer();
}
/**
* Initialize the player
*/
private void initMediaplayer() {
try {
File file = new File(Environment.getExternalStorageDirectory()
+ "/Download/", "aiqiu.mp3");
player.setDataSource(file.getPath());
Log.e("player", file.toString());
player.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if (!player.isPlaying()) {
player.start();
int totalTime = Math.round(player.getDuration() / 1000);
String str = String.format("%02d:%02d", totalTime / 60,
totalTime % 60);
tv2.setText(str);
mSeekBar.setMax(player.getDuration());
mHandler.postDelayed(runnable, 1000);
}
break;
case R.id.pause:
if (player.isPlaying()) {
player.pause();
}
break;
case R.id.stop:
if (player.isPlaying()) {
player.reset();
initMediaplayer();
}
break;
default:
break;
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (player ! = null) {
player.seekTo(seekBar.getProgress());
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO auto-generated method stubs
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO auto-generated method stubs
}
@Override
protected void onDestroy() {
// TODO auto-generated method stub
super.onDestroy();
if (player ! = null) {
player.stop();
hadDestroy = true;
player.release();
}
}
}
II. 動画ファイルを再生する
動画ファイルの再生は、音声ファイルの再生ほど複雑ではありませんが、ここではVideoViewクラスを使って実装しています。このクラスは、動画の表示と制御を一元的に行います。
VideoViewもMediaPlaerと同様で、以下の共通メソッドがあります。
メソッド名
機能説明
setVideoPath()
再生するビデオファイルの場所を設定します。
開始()
動画を開始または継続します。
pause()
ビデオの再生を一時停止する。
レジューム()
動画を再スタートさせます。
seekTo()
指定された位置から動画の再生を開始する。
isPlaying()
動画が現在再生中かどうかを判定します。
getDuration()
読み込んだビデオファイルのデュレーションを取得します。
例えば
private void initVideoPlayer() {
File file = new File(Environment.getExternalStorageDirectory()
+ "/Download/", "Sample.3gp");
videoPlayer.setVideoPath(file.getPath());// Specify the path to the video file
}
イベント処理
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if (!videoPlayer.isPlaying()) {
videoPlayer.start();
}
break;
case R.id.pause:
if (videoPlayer.isPlaying()) {
videoPlayer.pause();
}
break;
case R.id.stop:
if (videoPlayer.isPlaying()) {
videoPlayer.resume();
}
break;
default:
break;
}
}
III. MediaPlayerの一般的なエラー
つまり、そのエラーの状態です。例えば、このようなエラー開始は、彼のエラー状態を示す0と、状態0で呼ばれ、以下は、ソースコードで見つかったMediaPlayerの状態である。
enum media_player_states {
MEDIA_PLAYER_STATE_ERROR = 0, // 0 state
MEDIA_PLAYER_IDLE = 1 << 0, // 1 state
MEDIA_PLAYER_INITIALIZED = 1 << 1, // 2 state
MEDIA_PLAYER_PREPARING = 1 << 2, // 4 state
MEDIA_PLAYER_PREPARED = 1 << 3, // 8 state
MEDIA_PLAYER_STARTED = 1 << 4, // 16 states
MEDIA_PLAYER_PAUSED = 1 << 5, // 32 states
MEDIA_PLAYER_STOPPED = 1 << 6, // 64 state
MEDIA_PLAYER_PLAYBACK_COMPLETE = 1 << 7, // 128 state
}
報告されたエラーの状態とMediaPlayerのライフサイクル(上記)を参照することで、エラーを分析することができます。
関連
-
Solve Android 仮想メソッドの呼び出しに失敗する。NULLオブジェクトの参照で
-
android studio3.2 a pitfall: リソースの処理に失敗しました。詳細は上記の aapt の出力を参照してください。
-
Jniエラー:構造体でも組合でもないものにメンバー 'FindClass' を要求する、 解決方法
-
アンドロイドプログレスバー自定义
-
Android動的ブロードキャストの追加許可
-
AndroidでデータをExcelファイルに書き出す方法
-
アンドロイドアンダーライン(図形入り
-
自作のシンプルなアンドロイド用メモ帳アプリ
-
android.content.res.Resources$NotFoundException: 文字列リソースID #0x1
-
SQLiteReadOnlyDatabaseException: 読み取り専用のデータベースを書き込もうとした (コード 1032)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AndroidManifest.xml は、アプリが Google 検索でインデックス化されていないことを警告しています。
-
Android O (8.0) デスクトップショートカットを作成する
-
アンドロイドバージョン一覧
-
Manifest merger failed : Android 12以降をターゲットとするアプリは、明示的な指定が必要です。
-
Androidアプリの放送受信機登録(registerReceiver)処理の分析
-
android ImageViewの割り当て問題 setImageResourceとsetImageBitmap
-
AndroidのSMSメッセージ
-
Androidにおける縦の点線
-
Android Studioのインポートプロジェクトが表示されます。ファイルをクランチするのに失敗しました
-
Mac OS X用Android Studioショートカット