android 音乐模仿器demo,实现指定目录下的音乐循环播放,和在线播放的方法。...

利用android完成了指定目录下的音乐循环播放:

xml文件

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.musicplayer.MainActivity$PlaceholderFragment" >

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入地址:" 
        android:id="@+id/ed_t"
        />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/ed_t"
        android:layout_marginTop="16dp"
        android:text="播放" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_toRightOf="@+id/button1"
        android:text="暂停" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/button2"
        android:layout_marginLeft="19dp"
        android:layout_toRightOf="@+id/button2"
        android:text="停止" />

</RelativeLayout>

  activity文件

package com.example.musicplayer;

import java.io.File;
import java.io.IOException;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.content.DialogInterface;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.os.Build;

public class MainActivity extends Activity implements OnClickListener {

	private EditText ed;
	private Button bt1,bt2,bt3;
	private String path;
	private MediaPlayer mediaPlayer;
	private String[] musicpool;
	private int musicIndex=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if(savedInstanceState!=null)
        {
        	musicIndex=savedInstanceState.getInt("musicIndex");
        	System.out.println(musicIndex);
        }
        
        ed=(EditText) findViewById(R.id.ed_t);
        bt1=(Button) findViewById(R.id.button1);
        bt2=(Button) findViewById(R.id.button2);
        bt3=(Button) findViewById(R.id.button3);
//        ed.setText("data/data/zp.mp3");    
        bt1.setOnClickListener(this);
        bt2.setOnClickListener(this);
        bt3.setOnClickListener(this);
        bt3.setEnabled(false);  
        
//        path=ed.getText().toString();  //此处为方便测试将path设为我的手机目录,写死,本程序重在演示 mediaplayer的方法。
path="data/data/musics";
  //获得该目录下的文件名目录 File file=new File(path); musicpool=file.list(); // for(String s:musicpool) // System.out.println(s); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: mediaPlayer=new MediaPlayer(); startMusic(); bt2.setEnabled(true); bt1.setEnabled(false); bt3.setEnabled(true); mediaPlayer.setOnCompletionListener(new Complete()); break; case R.id.button2: if(bt2.getText().toString().equals("暂停")) { mediaPlayer.pause(); bt2.setText("续播"); } else if(bt2.getText().toString().equals("续播")) { mediaPlayer.start(); bt2.setText("暂停"); } break; case R.id.button3: bt1.setEnabled(true); bt2.setEnabled(false); mediaPlayer.release(); bt2.setText("暂停"); bt3.setEnabled(false); mediaPlayer=null; break; default: break; } }
                                               //完成播放的监听器      class Complete implements OnCompletionListener { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub try { mediaPlayer.reset(); musicIndex= (musicIndex+1)%(musicpool.length); startMusic(); mediaPlayer.setOnCompletionListener(new Complete()); } catch (Exception e) { e.printStackTrace(); } // bt1.setEnabled(true); } } public void startMusic()    // 播放音乐的2种方式 { try {
            //1、这种是将音乐写入工程中,生成R的文件引用,一般文件较小,在游戏里设为打斗的音效 // mediaPlayer = MediaPlayer.create(this, R.raw.zp0); // mediaPlayer.start();
// 2、这种方式是设定音乐播放器常用的方式 mediaPlayer.setDataSource(path+"/"+musicpool[musicIndex]); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new Preparelistener()); } catch (Exception e) { e.printStackTrace(); } } class Preparelistener implements OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("musicIndex", musicIndex); super.onSaveInstanceState(outState); System.out.println(); } }

 注意

1、 代码中有2种创建和启动音乐的方式,其中第一种是音乐文件导入到工程中多用于游戏中的打斗音效,第二多用于音乐播发器。其中播放有2种prepaere方式,

prepare(),是同步的,只有执行完了这句才会执行后面的,一般是音乐文件准备完了再播放,如果播放是本地音乐速度不会影响,但如果是音乐很大需要加载半天,影响用户体验。

prepareAsync()时异步的,启动了它后,会继续执行后面的代码无不影响,它需要设定监听器,如准备好了就开始播放mediaPlayer.setOnPreparedListener(new Preparelistener());

 2、代码中可以设定listview来点击播放,将点击返回的point复制给musicIndex再启动播放即可。也可以设定扫描全部文件,找到.mp3结尾的文件添加到musicpool,不过也要存入他们的路径,将数据接口改为hashma集合存储或者存入sharepreferece文件里,下次启动直接读取。

3、设定来电监听事件,监听电话状态,来暂停音乐。或者退出时候记录下当前musicIndex,下次接着播放那首歌。

 

二、在线播放,

					mediaPlayer=new MediaPlayer();
					String url ="http://192.168.61.173:8080/mymusics/zp0.mp3"; // your URL here
					MediaPlayer mediaPlayer = new MediaPlayer();
					mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
					try {
						mediaPlayer.setDataSource(url);
						Uri uri=Uri.parse(url);
						System.out.println(uri.getScheme());
						System.out.println(uri.getPath());
						//如果在主线程用mediaplayer.preapareAsync()
//						mediaPlayer.prepare();
//						mediaPlayer.start();
						mediaPlayer.prepareAsync();
						mediaPlayer.setOnPreparedListener(new Preparelistener());
						mediaPlayer.setOnCompletionListener(new Listener());
					} catch (Exception e) {
						e.printStackTrace();
					} 

  

 

转载于:https://www.cnblogs.com/bokeofzp/p/4736359.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Android音乐播放demo,支持本地sd卡路径下.mp3文件播放,上下歌曲切换,暂停、播放功能,手动控制进度条,支持安卓8.1+(需要apk访问sd卡权限)。具体实现可以参考以下步骤: 1.在AndroidManifest.xml文件中添加读写SD卡权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 2.在布局文件中添加音乐播放相关的控件: ```xml <Button android:id="@+id/btn_previous" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="上一首" /> <Button android:id="@+id/btn_play_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" /> <Button android:id="@+id/btn_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一首" /> <SeekBar android:id="@+id/seek_bar" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 3.在Activity中实现音乐播放相关的逻辑: ```java public class MainActivity extends AppCompatActivity implements View.OnClickListener { private MediaPlayer mediaPlayer; private Button btnPrevious; private Button btnPlayPause; private Button btnNext; private SeekBar seekBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnPrevious = findViewById(R.id.btn_previous); btnPlayPause = findViewById(R.id.btn_play_pause); btnNext = findViewById(R.id.btn_next); seekBar = findViewById(R.id.seek_bar); btnPrevious.setOnClickListener(this); btnPlayPause.setOnClickListener(this); btnNext.setOnClickListener(this); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { seekBar.setMax(mediaPlayer.getDuration()); mediaPlayer.start(); } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { btnPlayPause.setText("播放"); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_previous: // 上一首 break; case R.id.btn_play_pause: // 播放/暂停 if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); btnPlayPause.setText("播放"); } else { mediaPlayer.start(); btnPlayPause.setText("暂停"); } break; case R.id.btn_next: // 下一首 break; } } @Override protected void onDestroy() { super.onDestroy(); mediaPlayer.release(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值