今天讲下如何使用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>