android在线播放音乐
jopen
12年前
android在线音乐
一种方法是调用android自带的播放器
//调用系统自带播放器 Intent intent = new Intent(); Uri uri = Uri.parse("http://mul1.tximg.cn/music/group/bbs/mp3/44/100715/1279159638887.mp3?z=909255638"); intent.setDataAndType(uri, "audio/*"); intent.setAction(Intent.ACTION_VIEW); startActivity(intent);另一种方法是边下载边播放
这只是一种思路,参考别人的代码,实现分段下载,但是我的代码还很不完善,这方面不准备继续下去了。
package com.sharpandroid.music.activity; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; import com.sharpandroid.music.R; import com.sharpandroid.music.StreamingMediaPlay2; import com.sharpandroid.music.StreamingMediaPlayer; public class MediaPlayer extends Activity { private Button streamButton; private ImageButton playButton; private boolean isPlaying; private TextView playTime; private StreamingMediaPlayer audioStreamer; private StreamingMediaPlay2 audioStreamer2; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); initControls(); } private void initControls() { playTime=(TextView) findViewById(R.id.playTime); streamButton = (Button) findViewById(R.id.button_stream); streamButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { startStreamingAudio(); }}); playButton = (ImageButton) findViewById(R.id.button_play); playButton.setEnabled(false); playButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { if (audioStreamer2.getMediaPlayer().isPlaying()) { audioStreamer2.getMediaPlayer().pause(); playButton.setImageResource(R.drawable.button_play); } else { audioStreamer2.getMediaPlayer().start(); //audioStreamer.startPlayProgressUpdater(); playButton.setImageResource(R.drawable.button_pause); } isPlaying = !isPlaying; }}); } private void startStreamingAudio() { final SeekBar progressBar = (SeekBar) findViewById(R.id.progress_bar); if ( audioStreamer != null) { audioStreamer.interrupt(); } //调用系统自带播放器 // Intent intent = new Intent(); // Uri uri = Uri.parse("http://mul1.tximg.cn/music/group/bbs/mp3/44/100715/1279159638887.mp3?z=909255638"); // intent.setDataAndType(uri, "audio/*"); // intent.setAction(Intent.ACTION_VIEW); // startActivity(intent); audioStreamer2 = new StreamingMediaPlay2(this, playButton, streamButton, progressBar, playTime); audioStreamer2.startStreaming("http://mul1.tximg.cn/music/group/bbs/mp3/44/100715/1279159638887.mp3?z=909255638",5208, 216); streamButton.setEnabled(false); } }
下一个文件
package com.sharpandroid.music; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.Button; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; public class StreamingMediaPlay2 { private static final int INTIAL_KB_BUFFER = 96*10/8;//assume 96kbps*10secs/8bits per byte private ImageButton playButton; private SeekBar progressBar; private TextView playTime; private long mediaLengthInKb, mediaLengthInSeconds; private int totalKbRead = 0; private File downloadingMediaFile; private Context context; String url ; int progress_leng; private MediaPlayer mediaPlayer; private static final int DOWN_UPDATE = 1; boolean isplay = true; int playe = 0; private static final int DOWN_OVER = 2; private int progress; private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //super.handleMessage(msg); switch (msg.what) { case DOWN_UPDATE: progressBar.setProgress(progress); break; case DOWN_OVER: System.out.println("下载完成"); break; } } }; public StreamingMediaPlay2(Context context, ImageButton playButton, Button streamButton, SeekBar progressBar,TextView playTime) { this.context = context; this.playButton = playButton; this.playTime=playTime; //播放的进度时刻 this.progressBar = progressBar; } public void startStreaming(final String mediaUrl, long mediaLengthInKb, long mediaLengthInSeconds) throws IOException { // this.mediaLengthInKb = mediaLengthInKb; //this.mediaLengthInSeconds = mediaLengthInSeconds; url = mediaUrl; Thread down = new Thread(download); down.start(); } Runnable download = new Runnable(){ @Override public void run() { // TODO Auto-generated method stub URLConnection cn; try { cn = new URL(url).openConnection(); progress_leng = cn.getContentLength(); System.out.println("play-------------------77------长度------"+progress_leng); cn.connect(); InputStream stream = cn.getInputStream(); if (stream == null) { Log.e(getClass().getName(), "Unable to create InputStream for mediaUrl:" + url); } downloadingMediaFile = new File(context.getCacheDir(),"downloadingMedia.dat"); if (downloadingMediaFile.exists()) { downloadingMediaFile.delete(); //如果下载完成则删除 } FileOutputStream out = new FileOutputStream(downloadingMediaFile); byte buf[] = new byte[1024*10]; int numread = -1; int s = 0; int count = 0; int a = 0; int sum = 0; FileOutputStream out1 = null; // int totalBytesRead = 0, incrementalBytesRead = 0; while((numread = stream.read(buf))!=-1){ byte [] b = new byte[numread]; //System.out.println("输出numread的值-----------"+numread); //System.out.println(a+"----输出numread的值-----------"+sum); if(a==0||a%88==0){ File file = new File(context.getCacheDir(),"play"+(++count)+".dat"); System.out.println("输出count的值-----------"+count); out1 = new FileOutputStream(file,true); } a++; sum +=numread; if(out1!=null){ //b=buf; out1.write(buf,0,numread); } out.write(buf, 0, numread); s+=numread; progress = (int) (((float) s / progress_leng) * 100); handler.sendEmptyMessage(DOWN_UPDATE); if(a==150){ System.out.println("下载完成了"); //播放音乐 Thread thread = new Thread(play); thread.start(); handler.sendEmptyMessage(DOWN_OVER); } // totalBytesRead += numread; // incrementalBytesRead += numread; // totalKbRead = totalBytesRead/1000; //totalKbRead表示已经下载的文件大小 // testMediaBuffer(); // fireDataLoadUpdate(); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; //播放音乐 public MediaPlayer getMediaPlayer() { return mediaPlayer; } private MediaPlayer createMediaPlayer(File mediaFile) throws IOException { MediaPlayer mPlayer = new MediaPlayer(); mPlayer.setOnErrorListener( new MediaPlayer.OnErrorListener() { public boolean onError(MediaPlayer mp, int what, int extra) { Log.e(getClass().getName(), "Error in MediaPlayer: (" + what +") with extra (" +extra +")" ); return false; } }); FileInputStream fis = new FileInputStream(mediaFile); mPlayer.setDataSource(fis.getFD());//此方法返回与流相关联的文件说明符。 mPlayer.prepare(); return mPlayer; } private void startMediaPlayer() { try { System.out.println("开始播放音乐"); File bufferedFile = new File(context.getCacheDir(),"play1" + ".dat"); // moveFile(downloadingMediaFile,bufferedFile); Log.e(getClass().getName(),"Buffered File path: " + bufferedFile.getAbsolutePath()); Log.e(getClass().getName(),"Buffered File length: " + bufferedFile.length()+""); mediaPlayer = createMediaPlayer(bufferedFile); System.out.println(mediaPlayer.getDuration()+"------开始播放170---------------"+mediaPlayer.getCurrentPosition()); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.start(); //startPlayProgressUpdater(); // playButton.setEnabled(true); } catch (IOException e) { Log.e(getClass().getName(), "Error initializing the MediaPlayer.", e); } } //播放MP3 Runnable play = new Runnable() { @Override public void run() { // TODO Auto-generated method stub while(isplay){ try { System.out.println("开始播放音乐"); // File bufferedFile2 = new File(context.getCacheDir(),"play"+ (playe+1)+ ".dat"); // if(!bufferedFile2.exists()){ // isplay = false; // } File bufferedFile = new File(context.getCacheDir(),"play"+ (++playe)+ ".dat"); System.out.println("文件的名字为-------------"+playe); if(bufferedFile.exists()){ mediaPlayer = createMediaPlayer(bufferedFile); System.out.println(mediaPlayer.getDuration()+"------开始播放170---------------"+mediaPlayer.getCurrentPosition()); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.start(); isplay = false; try { Thread.sleep(120000); isplay = true; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else{ System.out.println("文件不存在----------------"); isplay = false; try { Thread.sleep(10000); isplay = true; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //startPlayProgressUpdater(); // playButton.setEnabled(true); } catch (IOException e) { Log.e(getClass().getName(), "Error initializing the MediaPlayer.", e); } } } }; }我这个只是为了验证是否想法可行,因此第二段音乐是在2分钟以后才继续播放的
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10px" android:background="@drawable/back"> <TextView android:id="@+id/text_kb_streamed" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textStyle="bold" android:text="流媒体测试"/> <Button android:id="@+id/button_stream" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10px" style="?android:attr/buttonStyleSmall" android:text="开始缓冲"/> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <SeekBar android:id="@+id/progress_bar" android:layout_height="wrap_content" android:layout_width="200px" style="?android:attr/progressBarStyleHorizontal" /> <TextView android:id="@+id/playTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/progress_bar" android:text="00:00" ></TextView> </RelativeLayout> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageButton android:id="@+id/button_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5px" style="?android:attr/buttonStyleSmall" android:src="@drawable/button_pause"/> </RelativeLayout> </LinearLayout>