使用Service实现网络音乐下载并播放

今天讲下如何使用Service实现网络音乐的下载,当下载完成后,发送通知,点开通知跳转到第二个Activity,点击播放按钮

调用系统自带的播放器播放音乐。

MainActivity:传递一个音乐路径让Service下载

package com.example.text10;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void download(View view) {
		Intent intent = new Intent(this, MyService.class);
		intent.putExtra("path", "http://10.17.152.88:8080/eason.mp3");
		startService(intent);
	}

}
创建IntentService的子类:

package com.example.text10;

import com.example.http.ExternalStorageUtils;
import com.example.http.HttpUtils;

import android.app.IntentService;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.util.Log;

public class MyService extends IntentService {

	private String fileName;
	public MyService(String name) {
		super(name);
		
	}
	public MyService(){
		super("");
	}
	
	/**
	 * 不能下载完音乐后直接在服务中播放(前提是使用Intent属性播放)
	 * 因为Intent属性播放音乐是有UI界面的,所以不能再服务中使用任何UI相关的内容
	 * 在SecondActivity执行如下代码:
	 * Intent intent = new Intent();
	 * intent.setAction(Intent.ACTION_VIEW);
	 * 指定路径:
	 * File sdFile = Environment.getExternalStorageDerctory();
	 * File file = new File(sdFile,fileName);
	 * Uri uri = Uri.fromFile(file);
	 * intent.setDataAndType(uri,"autio/*");
	 * startActivity(intent);
	 * @Override
	 */
	protected void onHandleIntent(Intent intent) {
		String path = intent.getStringExtra("path");
		fileName = path.substring(path.lastIndexOf("/") + 1);
		if (HttpUtils.isNetWorkConn(MyService.this)) {
			byte[] data = HttpUtils.getByteArray(path);
			if (data != null && data.length != 0) {
				boolean flag = ExternalStorageUtils.writeExternalStorageRoot(
						fileName, data, MyService.this);
				if (flag) {
					Log.i("main", "音乐下载完成");
					// 调用发送通知的方法
					sendNotification();
				} else {
					Log.i("main", "音乐下载失败");
				}
			} else {
				Log.i("main", "字节数组中无数据");
			}
		}
	}

	// 创建发送通知的方法
	private void sendNotification() {
		// 创建通知对象的Builder
		NotificationCompat.Builder builder = new Builder(MyService.this);
		// 设置通知标题
		builder.setContentTitle("音乐下载");
		// 设置通知内容
		builder.setContentText("音乐下载到sdcard成功");
		// 设置通知图标
		builder.setSmallIcon(R.drawable.ic_launcher);
		// 设置通知发送时间
		builder.setWhen(System.currentTimeMillis());
		// 设置要跳转的Activity
		Intent intent = new Intent(MyService.this, SecondActivity.class);
		// 把fileName传给SecondActivity
		intent.putExtra("fileName", fileName);
		// 创建延迟意图
		PendingIntent pendingIntent = PendingIntent.getActivity(MyService.this,
				1, intent, PendingIntent.FLAG_ONE_SHOT);
		// 将延迟意图给Builder构建器
		builder.setContentIntent(pendingIntent);
		// 获取通知管理器
		NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		// 发送通知
		manager.notify(0, builder.build());
	}

}

然后是在SecondActivity中实现音乐的播放的方法

public void play(View view){
		Intent intent = getIntent();
		//获取文件路径
		String fileName = intent.getStringExtra("fileName");
		//设置Intent动作
		Intent intent2 = new Intent(Intent.ACTION_VIEW);
		File file = new File(Environment.getExternalStorageDirectory(), fileName);
		Uri uri = Uri.fromFile(file);
		//设置播放类型
		intent.setDataAndType(uri, "audio/*");
		startActivity(intent2);
	}

下面是HttpUtils工具类:

package com.example.http;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class HttpUtils {

	//判断网络连接状态
	public static boolean isNetWorkConn(Context context){
		boolean flag = false;
		ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = manager.getActiveNetworkInfo();
		if (info != null) {
			return info.isConnected();
		}
		return flag;
	}
	//把path中的数据解析到数组中
	public static byte[] getByteArray(String path){
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(path);
		try {
			HttpResponse res = client.execute(get);
			if (res.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toByteArray(res.getEntity());
			}
		} catch (ClientProtocolException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		return null;
	}
}
然后是ExternalStorageUtils工具类:

package com.example.http;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;

public class ExternalStorageUtils {

	//判断sdCard是否可用
	public static boolean isSdcardUseful(){
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			return true;
		}
		return false;
	}
	//存储内容
	public static boolean writeExternalStorageRoot(String name,byte[] data,Context context){
		if (isSdcardUseful()) {
			//获取sdCard的根目录
			File sdFile = Environment.getExternalStorageDirectory();
			//创建文件的抽象路径
			File file = new File(sdFile, name);
			//向文件中写数据
			try {
				FileOutputStream fos = new FileOutputStream(file);
				fos.write(data, 0, data.length);
				fos.flush();
				fos.close();
				//返回true
				return true;
			} catch (Exception e) {
				
				e.printStackTrace();
			}
		}else{
			Log.i("main", "sdCard不可用");
		}
		return false;
	}
	//读取外部存储中根目录的文件
	public static byte[] readExternalStorageRoot(String fileName){
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		if (isSdcardUseful()) {
			File sdFile = Environment.getExternalStorageDirectory();
			File file = new File(sdFile, fileName);
			if (file.exists()) {
				//读取文件
				try {
					FileInputStream fis = new FileInputStream(file);
					byte[] buffer = new byte[1024];
					int len = 0;
					while((len = fis.read(buffer)) != -1){
						baos.write(buffer, 0, len);
						baos.flush();
					}
					fis.close();
					return baos.toByteArray();
				} catch (Exception e) {
					
					e.printStackTrace();
				}
			}else{
				Log.i("main", "文件不存在");
			}
		}
		return null;
	}
	//直接获取Bitmap的形式返回
	public static Bitmap readExternalStorageRootToBitmap(String fileName){
		Bitmap bitmap = null;
		if (isSdcardUseful()) {
			File file = new File(Environment.getExternalStorageDirectory(), fileName);
			bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
		}
		return bitmap;
	}
}
最后是加上权限:

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<service android:name="com.example.text10.MyService"></service>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A:实现音乐播放的基本步骤如下: 1. 创建MediaPlayer对象并设置数据源,音频文件可以是本地文件或网络文件。 ``` val mediaPlayer = MediaPlayer() mediaPlayer.setDataSource("http://xxx.com/xx.mp3") ``` 2. 准备播放器, 当音频数据准备好的时候,就可以开始播放了。 ``` mediaPlayer.prepare() mediaPlayer.start() ``` 3. 设置MediaPlayer的一些属性,如音量、循环播放、监听播放完成等。 ``` mediaPlayer.setVolume(1.0f, 1.0f) mediaPlayer.isLooping = true mediaPlayer.setOnCompletionListener { // 当音频播放完成时触发 } ``` 4. 为了方便控制音乐播放,通常会创建一个Service来管理MediaPlayer对象。 5. 可以在Activity或Fragment中调用Service中的播放控制方法,例如play()、pause()、stop()等。 实现代码示例: 1. 创建MusicService类,继承Service类,处理音乐播放相关逻辑。 ``` class MusicService : Service() { private lateinit var mediaPlayer: MediaPlayer override fun onBind(intent: Intent?): IBinder? { return null } override fun onCreate() { super.onCreate() mediaPlayer = MediaPlayer() } fun play(url: String) { mediaPlayer.reset() mediaPlayer.isLooping = true try { mediaPlayer.setDataSource(url) mediaPlayer.prepare() mediaPlayer.start() } catch (e: IOException) { e.printStackTrace() } mediaPlayer.setOnCompletionListener { // 音乐播放完成后的回调 } } fun pause() { if (mediaPlayer.isPlaying) { mediaPlayer.pause() } } fun stop() { if (mediaPlayer.isPlaying) { mediaPlayer.stop() } } override fun onDestroy() { super.onDestroy() mediaPlayer.release() } } ``` 2. 在AndroidManifest.xml中声明MusicService。 ``` <service android:name=".MusicService" /> ``` 3. 在Activity中调用MusicService实现音乐播放控制。 ``` class MainActivity : AppCompatActivity() { private val musicServiceIntent: Intent by lazy { Intent(this, MusicService::class.java) } private lateinit var musicService: MusicService private var isServiceBound: Boolean = false override fun onStart() { super.onStart() bindService(musicServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE) } override fun onStop() { super.onStop() if (isServiceBound) { unbindService(serviceConnection) isServiceBound = false } } private val serviceConnection = object : ServiceConnection { override fun onServiceConnected(name: ComponentName?, service: IBinder?) { val binder = service as MusicService.MusicServiceBinder musicService = binder.service isServiceBound = true } override fun onServiceDisconnected(name: ComponentName?) { isServiceBound = false } } fun play() { musicService.play("http://xxx.com/xx.mp3") } fun pause() { musicService.pause() } fun stop() { musicService.stop() } } ``` 以上就是使用Kotlin实现Android音乐播放的基本步骤,可根据项目需求进行优化和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值