简体   繁体   English

如何从android中的url播放音频文件

[英]how to play audio file from url in android

I need to play audio file from remote server in my app. 我需要在我的应用程序中播放远程服务器的音频文件。 I could play when I tested with localhost server (using WAMP). 当我使用localhost服务器(使用WAMP)测试时,我可以玩。 When the same file supplied from the server it is not working.. The file has no extension and the content is MP3 当从服务器提供相同的文件时它不工作..文件没有扩展名,内容是MP3

String fileUrl = "http://192.168.1.131/myproject/songs/xyz";
String url = "http://myserver/songs/xyz"; //(myserver -> A remote server)
mVideoView.setVideoURI(Uri.parse(fileUrl));
mVideoView.requestFocus();

Also I need to have a better control over player. 此外,我需要更好地控制玩家。
Please help... 请帮忙...

public void onRadioClick(View v) {

    if (!isPLAYING) {
        isPLAYING = true;
        MediaPlayer mp = new MediaPlayer();
        try {
            mp.setDataSource(getString(R.string.audio_stream));
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    } else {
        isPLAYING = false;
        stopPlaying();
    }
}

private void stopPlaying() {
    mp.release();
    mp = null;
}

The answer provided above provides synchronous fetching and playing, meaning currently executing thread will be blocked until prepare() is completed. 上面提供的答案提供了同步提取和播放,这意味着当前执行的线程将被阻止,直到prepare()完成。

prepareAsync() can be used instead to "prepare" the stream asynchronously. 可以使用prepareAsync()来异步“准备”流。 You also will need to handle onPrepared() event to start playing. 您还需要处理onPrepared()事件才能开始播放。

mediaPlayer.setDataSource(URL here);
mediaPlayer.prepareAsync();

Add OnPrepared event handler: 添加OnPrepared事件处理程序:

mPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mPlayer.start();
    }
});

Still, apparently there is no way to configure streaming buffer size. 显然,没有办法配置流缓冲区大小。 Frustrating... 令人沮丧的...

> import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;
import android.widget.SeekBar;

import com.google.ads.Ad;
import com.google.ads.AdListener;
import com.google.ads.AdRequest;
import com.google.ads.AdRequest.ErrorCode;
import com.google.ads.InterstitialAd;

/**
 * @author Rashid Ali
 * @Date Sep 18, 2014
 * @Email <rashid.android.developer@gmail.com>
 * 
 */

public class AudioPlayerActivity extends Activity implements OnClickListener,
        OnTouchListener, OnCompletionListener, OnBufferingUpdateListener,
        AdListener {

    private ProgressDialog progressBar;

    private static final String AD_UNIT_ID_GOES_HERE = "ca-app-pub-5453344383403527/5064575693";
    private InterstitialAd interstitialAd;

    private ImageButton buttonPlayPause;
    private SeekBar seekBarProgress;

    private MediaPlayer mediaPlayer;
    private int mediaFileLengthInMilliseconds; // this value contains the song
                                                // duration in milliseconds.
                                                // Look at getDuration() method
                                                // in MediaPlayer class

    private final Handler handler = new Handler();

    String audioName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_audio_player);

        interstitialAd = new InterstitialAd(this, AD_UNIT_ID_GOES_HERE);
        interstitialAd.setAdListener(this);
        AdRequest adRequest = new AdRequest();
        adRequest.addTestDevice(AdRequest.TEST_EMULATOR);
        interstitialAd.loadAd(adRequest);

        initilizeUI();

        Intent intent = getIntent();
        audioName = intent.getStringExtra("audioName");

    }

    /** This method is used to Initialize UI Components. */
    private void initilizeUI() {
        buttonPlayPause = (ImageButton) findViewById(R.id.ButtonTestPlayPause);
        buttonPlayPause.setOnClickListener(this);
        seekBarProgress = (SeekBar) findViewById(R.id.SeekBarTestPlay);
        seekBarProgress.setMax(99);
        seekBarProgress.setOnTouchListener(this);

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnBufferingUpdateListener(this);
        mediaPlayer.setOnCompletionListener(this);
    }

    /**
     * Method which updates the SeekBar primary progress by current song playing
     * position
     */
    private void primarySeekBarProgressUpdater() {
        seekBarProgress.setProgress((int) (((float) mediaPlayer
                .getCurrentPosition() / mediaFileLengthInMilliseconds) * 100)); // This
                                                                                // math
                                                                                // construction
                                                                                // give
                                                                                // a
                                                                                // percentage
                                                                                // of
                                                                                // "was playing"/"song length"
        if (mediaPlayer.isPlaying()) {
            Runnable notification = new Runnable() {
                public void run() {
                    primarySeekBarProgressUpdater();
                }
            };
            handler.postDelayed(notification, 1000);
        }
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        /**
         * Method which updates the SeekBar secondary progress by current song
         * loading from URL position
         */
        seekBarProgress.setSecondaryProgress(percent);
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        /**
         * MediaPlayer onCompletion event handler. Method which calls then song
         * playing is complete
         */
        // buttonPlayPause.setImageResource(R.drawable.button_play);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.SeekBarTestPlay) {
            /**
             * Seekbar onTouch event handler. Method which seeks MediaPlayer to
             * seekBar primary progress position
             */
            if (mediaPlayer.isPlaying()) {
                SeekBar sb = (SeekBar) v;
                int playPositionInMillisecconds = (mediaFileLengthInMilliseconds / 100)
                        * sb.getProgress();
                mediaPlayer.seekTo(playPositionInMillisecconds);
            }
        }
        return false;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.ButtonTestPlayPause) {
            /**
             * ImageButton onClick event handler. Method which start/pause
             * mediaplayer playing
             */
            try {
                mediaPlayer.setDataSource(audioName); // setup
                                                        // song
                                                        // from
                                                        // http://www.hrupin.com/wp-content/uploads/mp3/testsong_20_sec.mp3
                                                        // URL
                                                        // to
                                                        // mediaplayer
                                                        // data
                                                        // source
                mediaPlayer.prepare(); // you must call this method after setup
                                        // the datasource in setDataSource
                                        // method. After calling prepare() the
                                        // instance of MediaPlayer starts load
                                        // data from URL to internal buffer.
            } catch (Exception e) {
                e.printStackTrace();
            }

            mediaFileLengthInMilliseconds = mediaPlayer.getDuration(); // gets
                                                                        // the
                                                                        // song
                                                                        // length
                                                                        // in
                                                                        // milliseconds
                                                                        // from
                                                                        // URL

            if (!mediaPlayer.isPlaying()) {
                mediaPlayer.start();
                buttonPlayPause.setImageResource(R.drawable.pause_button);

            } else {
                mediaPlayer.pause();
                buttonPlayPause.setImageResource(R.drawable.play_button);
            }
            primarySeekBarProgressUpdater();
        }
    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();
        mediaPlayer.stop();
        this.finish();
    }

    @Override
    public void onDismissScreen(Ad arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onLeaveApplication(Ad arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPresentScreen(Ad arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onReceiveAd(Ad ad) {
        // TODO Auto-generated method stub
        if (ad == interstitialAd) {
            interstitialAd.show();
        }
    }

}

<RelativeLayout
    android:id="@+id/layout_header"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/header" >
</RelativeLayout>

<RelativeLayout
    android:id="@+id/ad_layout"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_below="@+id/layout_header" >

    <com.google.ads.AdView
        android:id="@+id/googleads"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        ads:adSize="BANNER"
        ads:adUnitId="ca-app-pub-5453344383403527/9634376094"
        ads:loadAdOnCreate="true" >
    </com.google.ads.AdView>
</RelativeLayout>

<RelativeLayout
    android:id="@+id/ad_layout"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true" >

    <com.google.ads.AdView
        android:id="@+id/googleads"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        ads:adSize="BANNER"
        ads:adUnitId="ca-app-pub-5453344383403527/2111109291"
        ads:loadAdOnCreate="true" >
    </com.google.ads.AdView>
</RelativeLayout>

    <RelativeLayout
        android:id="@+id/functional_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" >

        <ImageButton
            android:id="@+id/ButtonTestPlayPause"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="10dp"
            android:src="@drawable/play_button" />

        <SeekBar
            android:id="@+id/SeekBarTestPlay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_toRightOf="@+id/ButtonTestPlayPause" />
    </RelativeLayout>

If you are writing Java programs to play media files, then the first port of call is the MediaPlayer class. 如果您正在编写Java程序来播放媒体文件,那么第一个调用端口就是MediaPlayer类。 Typical code to play a file using the streaming mechanism of MediaPlayer is 使用MediaPlayer的流机制播放文件的典型代码是

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        Uri uri = Uri.parse("http://192.168.1.9/music/test.ogg");
        MediaPlayer player = new MediaPlayer();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setDataSource(this, uri);
        player.prepare();
        player.start();
    } catch(Exception e) {
        System.out.println(e.toString());
    }
}

Wake Lock Permission - If your player application needs to keep the screen from dimming or the processor from sleeping, or uses the MediaPlayer.setScreenOnWhilePlaying() or MediaPlayer.setWakeMode() methods, you must request this permission. 唤醒锁定权限 - 如果您的播放器应用程序需要防止屏幕变暗或处理器处于休眠状态,或者使用MediaPlayer.setScreenOnWhilePlaying()或MediaPlayer.setWakeMode()方法,则必须请求此权限。

<uses-permission android:name="android.permission.WAKE_LOCK" />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM