基于 Cordova 的应用程序:如何从 Android 内部存储/音乐文件夹播放音频文件

问题描述 投票:0回答:1

版本信息:

科尔多瓦版本12.0.0

cordova-media-plugin 版本 7.0.0

cordova-插件文件版本 8.1.0

cordova-插件文件传输版本2.0.0

cordova-plugin-wkwebview-file-xhr 版本 3.1.1

Android 目标 SDK = 34

问题/疑问:

我正在努力让基于 Cordova 的应用程序播放下载到 Android 设备的“内部存储/音乐”位置的文件。下面的 downloadAudio 函数可以正常工作,将文件保存在那里(尽管文件插件文档指出该位置是 SD 卡,但这不是它在我的设备上的工作方式)。

  1. 媒体插件可以从“file:///storage/emulated/0/Music/[file].mp3”位置播放吗?看来我需要媒体插件的 cdvfile 参考,但我不确定“cdvfile://”格式是否适用于此外部位置。它似乎仅供应用程序内部使用?
  2. 我无法使用任何 URL 转换方法(例如 toURL 给我 TypeError: fileTransferInternalUrl.toURL 不是函数)来处理我的文件位置而不返回错误,以便为媒体插件生成 cdvfile URL。
  3. 如果媒体插件不支持引用应用程序外部位置的播放,是否可以使用 copyTo(并覆盖现有文件)从外部位置到媒体插件可访问的临时内部位置? (文件插件文档的更高版本中似乎缺少 copyTo 文档,并且我在使用它时也遇到了错误。如果据说可能的话,可以给出更多细节。

使用 Cordova 复制文件

对我不起作用,也不适合

的示例

https://cordova.apache.org/docs/en/2.4.0/cordova/file/fileentry/fileentry.html.

我没有收到任何与权限相关的错误。如果是权限问题,我认为下载将无法进行(?)我知道 Android 权限发生了变化。

任何帮助将不胜感激!

function downloadAudio (fileTransferWebUrl,thisElement) {
    fileTransferWebUrl = encodeURI(fileTransferWebUrl);
    if (isAndroidApp == true) {
        var fileNameMP3Array = fileTransferWebUrl.split("/");
        var fileNameMP3 = fileNameMP3Array[fileNameMP3Array.length-1]; //get file name from web URL
        fileTransferInternalUrl = cordova.file.externalRootDirectory + 'Music/' + fileNameMP3; //  file:///storage/emulated/0/Music/[file].mp3
    }
    try {
        fileTransfer.download(
            fileTransferWebUrl, 
            fileTransferInternalUrl, 
            function (entry) {
                alert('Download complete to Music/' + fileNameMP3);
            },
            function(error){ //error
                alert("Download error source " + error.source + " download error target " + error.target + " download error code " + error.code + " http_status " + error.http_status + " body " + error.body + " exception " + error.exception);
            },
            true, //trust all hosts. safer to be false, set to true accepts all security certificates, not recommended for production use
        );
    }
    catch (e) {
        alert(e);
    }
}

function playDownloadedAudio (fileTransferWebUrl, thisElement) {
    var nativePath = "";
    fileTransferWebUrl = encodeURI(fileTransferWebUrl);
    if (isAndroidApp == true) {
        var fileNameMP3Array = fileTransferWebUrl.split("/");
        var fileNameMP3 = fileNameMP3Array[fileNameMP3Array.length-1]; //get file name from web URL
        fileTransferInternalUrl = cordova.file.externalRootDirectory + 'Music/' + fileNameMP3; //cordova.file.externalRootDirectory
        alert(fileTransferInternalUrl); // file:///storage/emulated/0/Music/A_casa_vete_y_cuenta_alli.mp3
    }
    try {
        nativePath = fileTransferInternalUrl; // how do I get this into a path Media plugin recognizes?
        my_media = new Media(nativePath,
            function () //success;
            { }, 
            function (err) //error
            { 
                alertOK(translate('Error in playback. Please contact support. \n Code: ','text') + error.code + '\n '+translate('Message:','text')+' '+error.message + '\n');
                playing = false;
            }
        );
        my_media.play();
    }
    catch (e) {
        alert("error: " + e);
    }
}
android cordova
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.