当前位置: 首页 > 知识库问答 >
问题:

如何在Android上使用Cordova将下载的文件加载到媒体插件中?

巩阳秋
2023-03-14

我被难住了。

我使用cordova 6.1.1构建了一个普通应用程序,并添加了媒体和文件传输插件。然后,我抄袭了文件插件CDVFile文档中描述的代码,尝试使用最小的javascript从外部位置下载MP3并播放。所以我替换了默认索引。js与以下属性:

var onDeviceReady = function() {
  var fileURL = 'cdvfile://localhost/temporary/test.mp3'
  var uri = 'https://www.dropbox.com/s/1mg3pqfmkuc5g4p/Mad%20Dad%27s%20Song%20v2%20TRACK.mp3?dl=1'

  var onSuccessfulDownload = function (entry) {
    console.log("Successfully downloaded to: " + entry.toURL());

    var my_media = new Media(fileURL, function(){
      console.log("Successfully loaded");
      alert("Successfully loaded");
    }, function(err) {
      console.log("Failed to load" + JSON.stringify(err));
      alert("Failed to load" + JSON.stringify(err));
    });
    my_media.play();
  }


  var ft = new FileTransfer();
  ft.download(encodeURI(uri), fileURL, onSuccessfulDownload);
}

document.addEventListener('deviceready', onDeviceReady, false);

当我在Android设备上运行此功能时(真实,未模拟),文件成功下载(“成功下载到:file:///data/data/com.example.media_test/cache/test.mp3”),但无法创建Media对象(“无法加载{”代码“:1}”)。使用adb logcat,我可以看到MediaPlayer尝试加载文件,但错误不是很详细:

V/MediaPlayer(15167): setListener
V/MediaPlayer-JNI(15167): setDataSourceFD: fd 151
V/MediaPlayer(15167): setDataSource(151, 0, 576460752303423487)
V/MediaPlayerService(  189): Create new client(106) from pid 15167, uid 10228, 
V/MediaPlayerService(  189): setDataSource fd=40, offset=0, length=576460752303423487
V/MediaPlayerService(  189): st_dev  = 45848
V/MediaPlayerService(  189): st_mode = 33152
V/MediaPlayerService(  189): st_uid  = 10228
V/MediaPlayerService(  189): st_gid  = 10228
V/MediaPlayerService(  189): st_size = 170536
V/MediaPlayerService(  189): calculated length = 170536
V/MediaPlayerService(  189): player type = 3
...snip ...
W/MediaExtractor(  189): FAILED to autodetect media content.
E/MediaPlayerService(  189):   error: -2147483648
... snip ...
E/MediaPlayer(15167): Unable to create media player
W/PluginManager(15167): THREAD WARNING: exec() call to Media.startPlayingAudio blocked the main thread for 33ms. Plugin should use CordovaInterface.getThreadPool().
... snip ...
I/chromium(15167): [INFO:CONSOLE(11)] "Failed to load{"code":1}", source: file:///android_asset/www/js/index.js (11)
    < li >如果我将mp3与我的源代码放在一起,我可以通过将媒体指向URL < code >/Android _ asset/www/test . MP3 来播放它,因此我知道这不是文件本身的问题 < li >我可以使用文件插件检查下载的mp3上的文件,这样我就知道它在那里。 < li >我尝试添加< code >

有什么提示可以让我调试这个东西吗?

编辑:

也:

  • 使用外部存储没有区别
  • 使用file://...将路径传递给Media并没有什么区别
  • 值得注意的是,如果我将不存在的路径传递给Media,则会引发不同的错误。我的问题不是Media找不到文件,而是它在下载后无法打开它。即使它可以在/android_asset/...
  • 中提供时打开它
  • 我可以将图像下载到相同的路径,然后在成功下载时显示它,例如document.getElementById('foo'). src=fileURL;。所以问题似乎不是关于一般的读写,而是关于打开那个MP3文件。

共有1个答案

章睿
2023-03-14

据我所知,在设备根植之前,您无法将文件写入应用程序的缓存目录。因此,我怀疑您是否真的能够使用任何文件资源管理器查看相应目录中的文件。您可以尝试使用cordova.file.externalRootDirectory或cordova.file.externalRootDirectory。此外,如果您在Android Marshmlow上测试它,那么您必须使用最新版本的cordova文件插件(4.2.0),因为旧版本似乎有权限问题,Marshmallow.Hope它有帮助。

 类似资料:
  • 比如说,我正在开发一个聊天应用程序,可以与其他人共享任何类型的文件(没有mimetype限制):比如图像、视频、文档,但也可以共享压缩文件,比如zip、rar、apk,或者更不常见的文件类型,比如photoshop或autocad文件。 在Android9或更低版本中,我直接将这些文件下载到下载目录,但在Android10中,如果不向用户显示下载它们的意图,就不可能做到这一点。。。 不可能的但为什

  • 我可以在Microsoft graph上使用Unity3d登录oauth 2,我请求了我的应用程序的此权限:https://graph.microsoft.com/files.readwrite.appfolder 在完成了通常的代码流(重定向到url、用户的权限、用身份验证码交换令牌代码和用令牌交换承载身份验证码)之后,我就可以登录了。 问题是上传小文件不起作用:https://docs.mic

  • 问题内容: 我正在使用Selenium WebDriver尝试将外部javascript文件插入DOM中,而不是将整个内容键入到executeScript中。 看起来好像已将节点正确放置到DOM中,但是随后它只是忽略了源代码,即,所述源js文件上的函数未运行。 这是我的代码: 我链接到的javascript文件的代码是 我已将js文件放在本地主机上,使用file:///进行了调用,并在外部服务器上

  • 我使用Selenium WebDriver尝试将外部javascript文件插入到DOM中,而不是将整个文件输入到Executescript中。 它看起来像是正确地将节点放入了DOM,但它只是忽略了源,即源js文件上的函数不运行。 下面是我的代码: 我链接到的javascript文件的代码是 我将js文件放在本地主机上,使用file:///调用它,并在外部服务器上进行了尝试。没有骰子。 我还尝试了

  • 问题内容: 我正在尝试从外部文件加载HTML并将文件的内容插入。 当我运行该函数时,它将HTML插入所有正文中,这是不够的。 我的代码: --------------------------> HTML <--------------------- ----- --------------------------> CSS <--------------------- ----- --------

  • 问题内容: 我有一个Maven插件,其配置中包含groupId,artifactId和版本。 我希望能够从远程存储库下载该工件并将文件复制到项目中。我不知道如何下载工件。 我知道我可以使用依赖插件来解决依赖关系,但是我需要在插件内部进行依赖。我怎样才能做到这一点? 问题答案: 您的插件需要使用ArtifactFactory以及要引导的工件的groupId,artifactId和版本创建一个Arti