当前位置: 首页 > 编程日记 > 正文

android在线播放音乐

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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;@Overridepublic 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 byteprivate 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(){@Overridepublic 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(){@Overridepublic void run() {// TODO Auto-generated method stubURLConnection 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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);}   }//播放MP3Runnable play = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile(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 blocke.printStackTrace();}}else{System.out.println("文件不存在----------------");isplay = false;try {Thread.sleep(10000);isplay = true;} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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="开始缓冲"/><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content" ><SeekBarandroid: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>	<RelativeLayoutandroid: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>

没有了,复制下来就能用

转载于:https://my.oschina.net/lhjtianji/blog/69211

相关文章:

head和tail命令详解

基础命令学习目录首页 原文链接&#xff1a;https://www.cnblogs.com/amosli/p/3496027.html 当要查看上千行的大文件时&#xff0c;我们可不会用cat命令把整个文件内容给打印出来&#xff0c;相反&#xff0c;我们可能只需要看文件的一小部分地内容&#xff08;例如文件的前十…

【FFmpeg】ffmpeg工具源码分析(四):filter(过滤器、滤镜)详解

1、简介 FFmpeg用来处理音视频,实现处理功能的核心就是filter(滤镜),和我们使用的美颜功能的滤镜意思差不多,FFmpeg的filter(滤镜)不仅可以处理视频,还能处理音频、字幕等。 官方说明: 在编码之前,ffmpeg可以使用 libavfilter 库中的过滤器处理原始音频和视频帧。几…

【ZooKeeper Notes 14】数据模型

转载请注明&#xff1a;ni掌柜 nileadergmail.com本文主要讲述ZooKeeper的数据模型&#xff0c;包括ZooKeeper的数据视图&#xff0c;节点的层次结构以及节点类型等基本属性。Zookeeper的视图结构类似标准的Unix文件系统&#xff0c;但是没有引入文件系统相关概念&#xff1a;目…

李理:为什么说人工智能可以实现?

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;尽管市面上关于深度学习的书籍很多&#xff0c;环信 AI 负责人李理认为大部分只关注理论或只关注实践。于是&#xff0c;基于他对深度学习多年的理解&#xff0c;自己着整理手写了一本深度学习理论与实战书…

【FFmpeg】FFmpeg编解码H264产生马赛克、伪影的解决方法

1、问题描述 使用FFmpeg编码H264,再解码显示时,产生马赛克:有时是在画面静止时,静止时间越长,马赛克、伪影越多;有时是在画面切入切出时;有时是在网络带宽不够时 2、原因分析 2.1 丢帧 网络状况差的情况下(带宽不足),容易丢帧,在视频画面播放过程中,若I帧丢失了,…

LINUX内核升级

内核版本是2.6.18&#xff0c;新的内核是2.6.26。 1.下载新内核&#xff0c;下载网站www.kernel.org 2.copy内核到/usr/local/src下 3.解压内核 解压内核命令 tar -xjvf linux-2.6.26.tar.bz2 4.清理以前编译所生成的文件 命令为 make distclean&#xff0c;如果以前没有编…

我在美团的这两年,想和你分享

作者 | 石晓文来源 | 小小挖掘机&#xff08;ID&#xff1a;wAIsjwj&#xff09;012017.08.14&#xff0c;结束了两周的等待&#xff0c;如愿以偿开始了自己的美团实习生活&#xff0c;本来抱着三五个月走人&#xff0c;争取下一份实习的心态&#xff0c;没想到一直到转为暑期实…

【Qt】QtCreator updatePchInfo:switching to none

1、Pch名词解释 Pch(PreCompiled Headers)预编译头文件。 使用方法: CONFIG+=precompile_header PRECOMPILED_HEADER=XXX.h 2、updatePchInfo:switching to none 和QtCreator代码格式化Beautifier插件配置了clang code model有关系。 猜测:clang分析预编译头文件相关,…

学习框架、库的经验

熟悉基础语法把框架的功能过一遍&#xff0c;看看有哪些功能从文档的demo入口去学习上手会更快在你的开发目录要有一个专门写demo的页面&#xff0c;用以调试页面&#xff0c;试验新功能如果框架或者库提供有demo则更好&#xff0c;可以从中得到很多有用的东西

开源应用程序结构

2019独角兽企业重金招聘Python工程师标准>>> 给有兴趣的同学介绍的。这里面介绍了很多著名的开源软件的架构&#xff0c;相信读后会有所收获。 地址&#xff1a;http://www.aosabook.org/en/index.html 转载于:https://my.oschina.net/qinlinwang/blog/71649

免费GPU哪家强?谷歌Kaggle vs. Colab

作者 | Jeff Hale译者 | Monanfei责编 | 夕颜出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;谷歌有两个平台提供免费的云端GPU&#xff1a;Colab和Kaggle&#xff0c; 如果你想深入学习人工智能和深度学习技术&#xff0c;那么这两款GPU将带给你很棒学习…

【SVN】svn“E155017工作副本的参考文件损坏、E200014文件校验和不匹配”的解决方法

1、问题描述 在执行svn提交时报错 svn: E155017: 工作副本的参考文件损坏 svn: E200014: ‘test.cpp’ 的文件校验和不匹配&#xff1a; 期望&#xff1a;xxxx 实际&#xff1a;xxxx 2、解决方法 2.1 拷贝 最好将提交的项目拷贝一份&#xff1b; 2.2 删除 使用svn rm --k…

QT程序启动加载流程简介

1. QT应用程序启动加载流程简介1.1 QWS与QPA启动客户端程序区别1.1.1 QWS(Qt Window System)介绍QWS(Qt Windows System)是QT自行开发的窗口系统&#xff0c;体系结构类似X Windows的C/S结构。QWS Server在物理设备上显示&#xff0c;QWS Client实现界面&#xff0c;两者…

QQ2012 Under Ubuntu

下载地址&#xff1a; QQ2012 Under Ubuntu转载于:https://www.cnblogs.com/ismdeep/archive/2012/08/09/2630067.html

25亿布局大湾区,创新工场的AI下一站

2019年6月5日&#xff0c;创新工场大湾区总部正式开业启动&#xff0c;集“产业投资AI 研究院商业赋能落地”三个功能为一体。当天创新工场还首次分享人工智能工程院成立两年来的成绩单&#xff0c;创新奇智的大湾区布局&#xff0c;并发布大湾区人才战略。创新工场也正式宣布第…

【TX2】TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口

1、简述 TX2开发板系统默认串口有ttyS0&#xff08;调试口&#xff09;、ttyTHS1、ttyTHS2、ttyTHS3&#xff0c;通过修改设备树文件&#xff0c;可以新增三个串口。 2、设备树 设备树中关于串口部分的描述 2.1 基础配置 注意&#xff1a;在这里状态都配置成禁止&#xff…

unix的发展

转载http://blog.51cto.com/1193432/1671058转载于:https://www.cnblogs.com/vwei/p/9588823.html

让你的输入框使用Google云语音输入技术

2019独角兽企业重金招聘Python工程师标准>>> 只需一行代码&#xff0c;你的网站上面输入框&#xff08;input&#xff09;&#xff0c;直接可以在谷歌浏览器&#xff08;chrome&#xff09;上面使用Google的云语音输入技术。 在你的输入框input的HTML属性里面&#…

速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条

作者 | Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee译者 | 刘畅责编 | Jane出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;【导读】在论文《YOLACT&#xff1a;Real-time Instance Segmentation》中&#xff0c;作者提出了一种简洁的实时实例分割全…

JSP内置对象基础知识小结

JSP提供9大内置内象&#xff1a;一、request内象&#xff1a;封装了由客户端生成的HTTP请求的所有细节&#xff0c;主要包括了http头信息&#xff0c;系统信息&#xff0c;请求方式&#xff0c;请求参数等。1、获取访问请求参数&#xff1a;request.getParameter("arg&quo…

一个正执行的程序如何启动另一新程序并关闭现执行程序

最简单的方法有两个函数即可实现&#xff1a; //启动新程序WinExec("存放另一新程序的路径", SW_SHOW);//关闭现执行软件 ExitThread(0); 若在win ce 下&#xff0c;用WinExec这个函数就不对了&#xff0c;那时就应该用ShellExecuteEx了。 SHELLEXECUTEINFO ShExecIn…

【android】java.lang.NoClassDefFoundError或classnotfount等异常错误

在android上开发&#xff0c;当导入一个外部的包&#xff0c;可能会出现这类错误&#xff0c;我已经两次碰到了&#xff0c;一次是用科大讯飞的android开发包&#xff0c;另一次是用Jsoup包&#xff08;html 解析&#xff09;。 解决方案&#xff1a; 先去掉加入的外部包 不要把…

Java面试题(一)部分题目

博主马上要面对几家公司的面试&#xff0c;故自己准备了点面试题&#xff0c;仅供参考&#xff01; 1&#xff0c;线程的创建的方式&#xff1a;答&#xff1a;1,继承Thread(注意&#xff0c;此类其实也是实现了Runnable接口的)&#xff0c;2,实现Runnable接口2&#xff0c;1. …

在win ce中如何使正在运行的软件自动升级更新

创建两个独立的程序A和B&#xff1a;A是现正在运行的程序&#xff0c;B是用于辅助新版本的A覆盖旧版A 在客户端先运行A&#xff0c;使A提供从服务器端下载新版A放于一临时文件夹中&#xff0c;并运行B&#xff0c;关闭A&#xff1b; 运行的B用于执行&#xff1a;用新版A覆盖旧…

刘铁岩:AI打通关键环节,加快物流行业数字化转型

导语&#xff1a;近日&#xff0c;在微软亚洲研究院创新论坛上&#xff0c;微软亚洲研究院副院长刘铁岩分享了关于“AI物流”行业的实践经验。以下为其发言内容。 随着时代的发展&#xff0c;人工智能成为了决定性的技术&#xff0c;我们所谈的企业数字化转型也正在从“互联网”…

Unity的三种Interceptor

Unity默认提供了三种拦截器&#xff1a;TransparentProxyInterceptor、InterfaceInterceptor、VirtualMethodInterceptor。 TransparentProxyInterceptor&#xff1a;代理实现基于.NET Remoting技术&#xff0c;它可拦截对象的所有函数。缺点是被拦截类型必须派生于MarshalByRe…

Python编写循环的两个建议 | 鹅厂实战

作者 | piglei&#xff08;腾讯高级工程师&#xff09;转载自腾讯技术工程知乎专栏循环是一种常用的程序控制结构。我们常说&#xff0c;机器相比人类的最大优点之一&#xff0c;就是机器可以不眠不休的重复做某件事情&#xff0c;但人却不行。而“循环”&#xff0c;则是实现让…

作为JavaScript开发人员,这些必备的VS Code插件你都用过吗

本文翻译自&#xff1a;https://www.sitepoint.com/vs-code-extensions-java-developers/转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。如今&#xff0c;Visual Studio Code无疑是最流行的轻量级…

matlab常遇小问题汇总

1、如何注释掉多行&#xff1a; 同时注释掉多行&#xff0c;有2种方法可行&#xff1a; (1)、选中所有要注释的行&#xff0c;按快捷键"Ctrl R" 或者 选择工具菜单"Text --> Comment"; 如果释放所有要注释的行&#xff0c;则按快捷键"Ctrl T&qu…

《几何与代数导引》习题1.35.4

求直线之间的距离$l_1:\frac{x1}{-1}\frac{y-1}{3}\frac{z5}{2}$.$l_2:\frac{x}{3}\frac{y-6}{-9}\frac{z5}{-6}$.解&#xff1a;点$q(-1,1,-5)$在直线$l_1$上&#xff0c;点$p(0,6,-5)$在直线$l_2$上.$\vec{pq}(-1,-5,0)$.直线$l_1$的方向向量为$(-1,3,2)$,直线$l_2$的方向向量…