以编程方式检查下载的MP3/OGG文件在android中是否有效/完整

以编程方式检查下载的MP3/OGG文件在android中是否有效/完整,android,audio,mp3,ogg,ringtone,Android,Audio,Mp3,Ogg,Ringtone,我正在以编程方式从用户提供的URL下载音频文件MP3/OGG。我还将继续将下载的文件设置为ringtone/alarmtone。但是,我需要通过编程验证下载的文件是否是有效的MP3/OGG文件,并且是否可以播放。如何确保下载的文件是有效的MP3/OGG文件,而不是来自虚假URL的垃圾头 我用来下载的代码: try { URL url = new URL(link); httpConn = (HttpURLConnection) url.openConnection

我正在以编程方式从用户提供的URL下载音频文件MP3/OGG。我还将继续将下载的文件设置为ringtone/alarmtone。但是,我需要通过编程验证下载的文件是否是有效的MP3/OGG文件,并且是否可以播放。如何确保下载的文件是有效的MP3/OGG文件,而不是来自虚假URL的垃圾头

我用来下载的代码:

try {
        URL url = new URL(link);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setRequestMethod("GET");
        httpConn.setReadTimeout(20000);
        httpConn.setConnectTimeout(10000);
        httpConn.connect();
        int responseCode = httpConn.getResponseCode();
        if (responseCode != HttpURLConnection.HTTP_OK) {
            Log.i(TAG, "http response error code "+responseCode+" for "+name);
            return -1;
        }

        int lenghtOfFile = httpConn.getContentLength();
        Log.d(TAG, "Length of file to download: " + lenghtOfFile + " for " + name + " id_download "+id_download);
        if (lenghtOfFile == -1) {
            return -1; // no length to download
        }
        // input stream to read file - with 8k buffer
        input = new BufferedInputStream(httpConn.getInputStream(),1000000);

        // Delete the outfile first
        File deleteFile = new File(outfile);
        if (deleteFile.exists()) {
            if (deleteFile.delete())
                Log.i(TAG, "File deleted " + outfile);
            else
                Log.i(TAG, "File could'nt be deleted " + outfile);
        }

        output = new FileOutputStream(outfile);
        byte data[] = new byte[1000000];

        long total = 0;
        int progress = 0;
        long mLastUpdate = 0;

        int count = 0;
        while ((count = input.read(data)) != -1) {
            total += count;
            progress = (int) ((total * 100) / lenghtOfFile);
            Log.d(TAG, name + " progress " + progress+"  count "+count+" total "+total);
            output.write(data, 0, count);
            if (System.currentTimeMillis() - mLastUpdate > 1000) {
                mLastUpdate = System.currentTimeMillis();
            }
        }

        output.flush();
    } catch (Exception e) {
        Log.e(TAG, "Exception in downloadUrl() " + e + " for " + name + "  " + id_download + "  "+task_id);
        return -1;
    } finally {
        try {
            if (output != null) {
                output.close();
            }
            if (input != null) {
                input.close();
            }
            if (httpConn != null) {
                httpConn.disconnect();
            }
        } catch (Exception ex) {
            Log.e(TAG,"Exception in close "+ex);
        }
    }

您可以检查下载流的结尾,如果它被调用,它表示您下载的文件的完整长度。 如果这个答案对你有效,你会接受吗?
谢谢

我通过使用MediaMetadataRetriever类的API“extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u DURATION)”解决了这个问题。如果是有效的mp3/ogg文件,则返回有效的持续时间。否则,我将捕获一个运行时异常并从API返回。

您使用什么下载?它是否有一个侦听器或回调,让您知道下载完成了什么?发布您的下载代码我要求用户在web服务器中提供名称和url,并一次性下载所有文件。我编写了一个API来下载文件,成功时返回1,失败时返回0。成功下载文件后,我继续将其设置为铃声。您正在寻找创意吗?如何做到这一点?@Ajay用下载代码更新了问题。是的,我正在寻找一种方法来验证下载的MP3/OGG文件。我不认为这对伪造的URL有效。带有随机数据的随机链接也将发送下载流的末尾。我想验证的是,下载的文件是可播放的mp3/ogg。在这种情况下,您可以尝试安装该文件,比如说它是否为APK,并检查结果。对于mp3/ogg文件也一样,您可以尝试播放,以确保该文件未损坏。这仅提供媒体元数据中设置的持续时间,而不考虑媒体的完整性。i、 e.如果音乐文件未完全下载,则此键应返回完整媒体的持续时间。