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


    一、安卓网络编程

    在这里插入图片描述

    二、运行效果

    • 输入音乐网址,下载并播放音乐
      在这里插入图片描述

    三、涉及知识点

    1. 线性布局(LinearLayout)
    2. 媒体播放器(MediaPlayer)
    3. 文本编辑框(EditText)
    4. 按钮(Button)
    5. 网址连接类(URLConnection)
    6. 异步任务(AsyncTask)
      在这里插入图片描述

    四、实现步骤

    (一)创建安卓应用

    • 基于Empty Activity创建安卓应用 - DownloadMusicPageByURLConnection
      在这里插入图片描述
      在这里插入图片描述

    (二)准备图片素材

    • 将背景图片拷贝到mipmap-xhdpi目录
      在这里插入图片描述

    (三)主布局资源文件

    • 主布局资源文件 - main_activity.xml
      在这里插入图片描述
    
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    (四)字符串资源文件

    • 字符串资源文件 - 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (五)授权访问因特网与读写外置存储卡

    • 在安卓项目清单文件里授权访问因特网与读写外置存储卡
      在这里插入图片描述

    (六)在主界面里实现功能

    • 主界面 - 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();                        
        }                                                                                                        
    }                                                                                                                                                                                                                                                                                                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    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);                                                             
    }                                                                                                                                                                                                                                            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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();                                          
        }                                                                                                          
    }                                                                                                              
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    6、编写清空按钮单击事件处理方法

    • 编写doClear(View view)方法
      在这里插入图片描述
    /**                                                     
     * 清空按钮单击事件处理方法                                         
     *                                                      
     * @param view                                          
     */                                                     
    public void doClear(View view) {                        
        // 清空音乐网址文本框                                        
        edtMusicUrl.setText("");                            
    }                                                                            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    • webapps里创建music目录,放置一首mp3音乐文件 - Terra.mp3
      在这里插入图片描述

    (八)启动Tomcat服务

    • 双击Tomcat的bin目录里的startup.bat批处理文件图标
      在这里插入图片描述

    • 查看本机IP地址:192.168.129.112
      在这里插入图片描述

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

    • 输入音乐网址,下载并播放音乐
      在这里插入图片描述
    • 查看下载的音乐文件 - /mnt/sdcard/Download/Terra.mp3
      在这里插入图片描述
  • 相关阅读:
    用户头像(图片文件)上传(Vue + nodejs 前后端)
    CSDN竞赛7期题解
    SpringBoot项目--电脑商城【显示勾选的购物车数据】
    Spring用于开发Web应用程序常用注解
    操作系统01_进程管理_---软考高级系统架构师006
    2022年上半年信息系统项目管理师下午案例分析真题及答案解析
    数据结构与算法编程题2
    系统架构设计师(第二版)学习笔记----系统架构设计师概述
    TMS Logging提供了短日志输出
    .m3u8.sqlite文件转mp4,m3u8.sqlite文件转视频工具(开源免费)
  • 原文地址:https://blog.csdn.net/howard2005/article/details/125884423