安卓案例:利用URLConnection下载音乐

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓案例:利用URLConnection下载音乐相关的知识,希望对你有一定的参考价值。

文章目录

一、安卓网络编程

二、运行效果

  • 输入音乐网址,下载并播放音乐

三、涉及知识点

  1. 线性布局(LinearLayout)
  2. 媒体播放器(MediaPlayer)
  3. 文本编辑框(EditText)
  4. 按钮(Button)
  5. 网址连接类(URLConnection)
  6. 异步任务(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对象(空格要转换成%20才能识别)                                                                        
            URL url = new URL(strMusicUrl.replace(" ", "%20"));                                              
            // 获取URL连接                                                                                       
            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)方法
/**                                                                                        
 * 下载按钮单击事件处理方法                                                                            
 *                                                                                         
 * @param 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)方法
/**                                                                                                            
 * 播放按钮单击事件处理方法                                                                                                
 *                                                                                                             
 * @param 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)方法
/**                                                     
 * 清空按钮单击事件处理方法                                         
 *                                                      
 * @param view                                          
 */                                                     
public void doClear(View view)                         
    // 清空音乐网址文本框                                        
    edtMusicUrl.setText("");                            
                                                                            

(七)Tomcat服务器上放置音乐文件

  • webapps里创建music目录,放置一首mp3音乐文件 - Terra.mp3

(八)启动Tomcat服务

  • 双击Tomcat的bin目录里的startup.bat批处理文件图标

  • 查看本机IP地址:192.168.129.112

(九)运行程序,查看结果

  • 输入音乐网址,下载并播放音乐
  • 查看下载的音乐文件 - /mnt/sdcard/Download/Terra.mp3

以上是关于安卓案例:利用URLConnection下载音乐的主要内容,如果未能解决你的问题,请参考以下文章

安卓案例:利用URLConnection下载网页

安卓案例:利用URLConnection下载图片

安卓案例:利用URLConnection下载图片

安卓案例:利用URLConnection下载网页

重磅资讯:全球下载量最大的抖音国际版TikTok借助Audius利用IPFS&Filecoin存储和确权

H5中背景音乐无法自动播放问题