zoukankan      html  css  js  c++  java
  • Android 使用URLConnection下载音频文件

    本文链接: Android 使用URLConnection下载音频文件

    使用MediaPlayer播放在线音频,请参考Android MediaPlayer 播放音频

    有时候我们会需要下载音频文件。这里提供一种思路,将在线音频文件通过流写到本地文件中。
    使用URLConnection来建立连接,获取到的数据写到文件中。

    URLConnection建立连接后,可以获取到数据长度。由此我们可以计算出下载进度。

        public class DownloadStreamThread extends Thread {
            String urlStr;
            final String targetFileAbsPath;
    
            public DownloadStreamThread(String urlStr, String targetFileAbsPath) {
                this.urlStr = urlStr;
                this.targetFileAbsPath = targetFileAbsPath;
            }
    
            @Override
            public void run() {
                super.run();
                int count;
                File targetFile = new File(targetFileAbsPath);
                try {
                    boolean n = targetFile.createNewFile();
                    Log.d(TAG, "Create new file: " + n + ", " + targetFile);
                } catch (IOException e) {
                    Log.e(TAG, "run: ", e);
                }
                try {
                    URL url = new URL(urlStr);
                    URLConnection connection = url.openConnection();
                    connection.connect();
                    int contentLength = connection.getContentLength();
                    InputStream input = new BufferedInputStream(url.openStream());
                    OutputStream output = new FileOutputStream(targetFileAbsPath);
    
                    byte[] buffer = new byte[1024];
                    long total = 0;
                    while ((count = input.read(buffer)) != -1) {
                        total += count;
                        Log.d(TAG, String.format(Locale.CHINA, "Download progress: %.2f%%", 100 * (total / (double) contentLength)));
                        output.write(buffer, 0, count);
                    }
                    output.flush();
                    output.close();
                    input.close();
                } catch (Exception e) {
                    Log.e(TAG, "run: ", e);
                }
            }
        }
    
    

    启动下载,即启动线程。

    new DownloadStreamThread(urlStr, targetFileAbsPath).start();
    

    值得注意的是,如果本地已经有了文件,需要做一些逻辑判断。例如是否删掉旧文件,重新下载。或是判断出已有文件,中止此次下载任务。
    例如可以用connection.getContentLength()与当前文件长度来比较,如果不一致,则删掉本地文件,重新下载。

    实际上,URLConnection能处理很多流媒体。在这里是用来下载音频文件。可以实现下载功能和类似“边下边播”的功能。

    代码可以参考示例工程: https://github.com/RustFisher/android-MediaPlayer

  • 相关阅读:
    With great power comes great responsibility
    2016年你应该学习的语言和框架
    箜篌长萧各一曲,月清淡似风人未眠。
    使用 RUP 管理小型项目和团队
    php文件加锁 lock_sh ,lock_ex
    PHP_EOL
    PHP输入流php://input介绍
    获取ip地址
    关键词拍卖和广义二阶拍卖(Internet Advertising and the Generalized Second-Price Auction译文)
    常用js选择
  • 原文地址:https://www.cnblogs.com/rustfisher/p/11576548.html
Copyright © 2011-2022 走看看