一、安卓网络编程

二、运行效果
- 输入音乐网址,下载并播放音乐

三、涉及知识点
- 线性布局(LinearLayout)
- 媒体播放器(MediaPlayer)
- 文本编辑框(EditText)
- 按钮(Button)
- 网址连接类(URLConnection)
- 异步任务(AsyncTask)

四、实现步骤
(一)创建安卓应用
- 基于Empty Activity创建安卓应用 -
DownloadMusicPageByURLConnection  
(二)准备图片素材
- 将背景图片拷贝到
mipmap-xhdpi 目录 
(三)主布局资源文件
- 主布局资源文件 -
main_activity.xml 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/background"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp">
<EditText
android:id="@+id/edtMusicUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/input_music_url"
android:lines="3" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/btnDownload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:onClick="doDownload"
android:text="@string/download"
android:textSize="20sp" />
<Button
android:id="@+id/btnPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:onClick="doPlay"
android:text="@string/play"
android:textSize="20sp" />
<Button
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:onClick="doClear"
android:text="@string/clear"
android:textSize="20sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#bbbbbb" />
<ProgressBar
android:id="@+id/pbDownloadMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>
(四)字符串资源文件
- 字符串资源文件 -
strings.xml 
<resources>
<string name="app_name">利用URLConnection下载音乐</string>
<string name="download">下载</string>
<string name="input_music_url">输入音乐网址</string>
<string name="play">播放</string>
<string name="clear">清空</string>
</resources>
(五)授权访问因特网与读写外置存储卡
- 在安卓项目清单文件里授权访问因特网与读写外置存储卡

(六)在主界面里实现功能
- 主界面 -
MainActivity 
1、声明变量,获取控件实例
- 声明件变量,然后获取控件实例

2、请求读写外置存储卡权限
- 检查是否读写权限,如果没有,那么就请求读写权限

3、创建下载资源的异步任务类
- 在MainActivity里继承
AsyncTask 创建DownloadTask 类 
private class DownloadTask extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pbDownloadMusic.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(String... params) {
String strMusicUrl = params[0];
try {
URL url = new URL(strMusicUrl.replace(" ", "%20"));
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
musicName = strMusicUrl.substring(strMusicUrl.lastIndexOf("/") + 1);
FileOutputStream fos = new FileOutputStream(downloadDir.getAbsolutePath() + "/" + musicName);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
super.onPostExecute(unused);
pbDownloadMusic.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "恭喜,音乐文件下载成功!", Toast.LENGTH_SHORT).show();
}
}
4、编写下载按钮单击事件处理方法
- 编写
doDownload(View view) 方法 
public void doDownload(View view) {
String strMusicUrl = edtMusicUrl.getText().toString();
if (strMusicUrl.equals("")) {
Toast.makeText(this, "请输入音乐网址!", Toast.LENGTH_SHORT).show();
return;
}
DownloadTask task = new DownloadTask();
task.execute(strMusicUrl);
}
5、编写播放按钮单击事件处理方法
- 编写
doPlay(View view) 方法 
public void doPlay(View view) {
if (downloadDir != null && musicName != null) {
try {
mp.reset();
mp.setDataSource(downloadDir.getAbsolutePath() + "/" + musicName);
mp.prepare();
mp.start();
Toast.makeText(this, "开始播放……", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(MainActivity.this, "音乐播放失败!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "请先下载音乐文件!", Toast.LENGTH_SHORT).show();
}
}
6、编写清空按钮单击事件处理方法
- 编写
doClear(View view) 方法 
public void doClear(View view) {
edtMusicUrl.setText("");
}
(七)Tomcat服务器上放置音乐文件
- 在
webapps 里创建music 目录,放置一首mp3音乐文件 - Terra.mp3 
(八)启动Tomcat服务
(九)运行程序,查看结果
- 输入音乐网址,下载并播放音乐
 - 查看下载的音乐文件 -
/mnt/sdcard/Download/Terra.mp3 
|