Android。正确下载mp3

Android. To download mp3 properly

我遇到了一个奇怪的问题。我编写了 android 用于下载 mp3 文件的应用程序。我用 url 下载 mp3,它工作正常。但是除 VLC 之外的任何播放器都无法在设备上找到这些下载的 mp3 文件。如果我使用任何文件管理器,我可以找到这些文件,但它们没有 mp3 标签。

例如

这是随我的应用程序一起下载的文件。我用 FX 文件管理器打开它的属性。

而且是用另一个程序(不是我的)下载的mp3。如您所见,该文件具有 mp3 标签(显示在屏幕底部)

这是我下载文件的代码:

@Override
protected Void doInBackground(String... params) {               
    InputStream inputStream =  null;
    FileOutputStream fileOutput =  null;
    try {
        URL url = new URL(params[0]); 
        File file = new File(path);              
        URLConnection urlConnection = url.openConnection();

        inputStream = urlConnection.getInputStream();
        fileOutput = new FileOutputStream(file);

        int totalSize = urlConnection.getContentLength();
        int downloadedSize = 0;

        byte[] buffer = new byte[16384];
        int bufferLength = 0; 

        while ((bufferLength = inputStream.read(buffer)) > 0 ) {

            while(isPaused) {
                sleep();
            }

            if(isCancelled()) {                 
                if(file.exists())
                    file.delete();
                return null;
            }

            fileOutput.write(buffer, 0, bufferLength);
            downloadedSize += bufferLength;
            publishProgress(downloadedSize, totalSize);
        }

        if(totalSize > getFreeMemorySize()) {
        //if(true) {
            if(errorHandler != null)
                errorHandler.onMemorySizeException();
            cancel(true);
        }                       
    } catch (IOException e) {
        int i = e.hashCode();
        e.getStackTrace();
    }
    finally {
        try {

            if(inputStream != null)
                inputStream.close();
            if(fileOutput != null)
                fileOutput.close();    

        } catch (IOException e) {
            int i = e.hashCode();
            e.getStackTrace();
        }
    }
    return null;
} 

我哪里错了?为什么用我的应用程序下载的 mp3 文件可以用 mp3 播放器找到?我该如何解决?

您所观察到的事实是 MediaStore 并不经常更新他的数据库。数据库仅在重新启动和安装 sd 卡后更新。

如果您希望您的文件立即出现,您必须告诉 MediaStore 添加它们。

使用MediaScannerConnection.scanFile方法通知MediaStore。 (MediaScannerConnection doucumentation) 请注意,您可以一次添加多个 files/paths。另外值得注意的是,此方法是异步的,文件是在一个单独的进程中添加的,这可能需要一些时间 - 操作完成时会通知您。

MediaScannerConnection.scanFile(
  context,
  new String[]{file.getAbsolutePath()},
  null,
  new OnScanCompletedListener() {
     @Override
     public void onScanCompleted(String path, Uri uri) {
         // only at this point are files in MediaStore
     }
  });