zoukankan      html  css  js  c++  java
  • 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();
    					} 
    

      

  • 相关阅读:
    错误:Authentication with old password no longer supported, use 4.1 style passwords.
    百度有钱 邀请码
    [datatables杂记] sAjaxSource 数据源 Search 后 fnInitComplete 不执行。
    uploadify onComplete 不执行?
    VS 2013 简体中文 专业版 下载地址。
    C# 导出图片到Word (通过XML实现)
    使用OutLook发送一封带附件的邮件
    WebBrower使用 Http 代理访问网页
    .net SMTP 发送邮件
    C# 汉字转拼音 方法(汉字的发音不过400多种(不算声调))
  • 原文地址:https://www.cnblogs.com/bokeofzp/p/4736359.html
Copyright © 2011-2022 走看看