2016-04-19 18 views
0

まあ、私は困惑しています。AndroidでCordovaを使用してダウンロードしたファイルをMediaプラグインに読み込む方法は?

コードバを使用する6.1.1私はバニラアプリを作り、メディアとファイル転送プラグインを追加しました。私はFile Plugin CDVFile documentationに記載されているコードを埋め込み、外部の場所からMP3をダウンロードして再生するための最小限のjavascriptを作成しようとしました。だから私は、次のようにデフォルトのindex.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デバイス(実、エミュレートされていない)でこれを実行すると、正常にファイルのダウンロード(「Successfully downloaded to: file:///data/data/com.example.media_test/cache/test.mp3」)が、メディアオブジェクトはできません作成する( "Failed to load{"code":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) 
  • 私は私のソースコードでmp3を入れた場合、私はそう、URL /android_asset/www/test.mp3でメディアを指していることにより、それを再生することができますファイル自体に問題はないことが分かっています。
  • ダウンロードしたmp3でFileプラグインを使用して、そこにあることがわかります。
  • <access origin="cdvfile://*"/>をconfig.xmlに追加し、コンテンツセキュリティポリシーを<meta http-equiv="Content-Security-Policy" content="* * 'self' default-src 'unsafe-inline' 'unsafe-eval' http://* https://* data: cdvfile://* content://*;">に設定してみましたが、役に立たなくなりました。
  • cdvfile://localhost/persistent/test.mp3へのローカルパスを変更すると、

私はこの事をデバッグできる方法上の任意のヒントを違いを確認しないのですか?

EDIT:また

:外部ストレージを使用して

  • は違い
  • file://...を使用してメディアへのパスを渡すと、それは価値が違い
  • をしないことはありません。 Mediaに存在しないパスを渡すと、別のエラーが発生することに注意してください。私の問題は、メディアがファイルを見つけることができないということではなく、ダウンロードされた後にファイルを開くことができないことです。それは/android_asset/...
  • で提供されますとき、それはそれを開くことができたとしても、私は同じパスに画像をダウンロードし、それがdocument.getElementById('foo').src = fileURL;ようなものでonSuccessfulDownload表示することができます。だから、この問題は一般的には読書や執筆のようではなく、むしろそのMP3ファイルを開くことに関するものです。
+0

cdvfile url(file:///data/data/com.example.media_test/cache/test.mp3)ではなく、ファイルurlから再生するとどうなりますか? – user3791775

+0

質問していただきありがとうございます - まったく同じことが起こります! – Patrick

答えて

0

私が知る限り、デバイスがルートされるまで、アプリケーションのキャッシュディレクトリにファイルを書き込むことはできません。だから私はあなたが本当にファイルエクスプローラを使用して、それぞれのディレクトリ内のファイルを表示することができるかどうかは疑問です。

代わりにcordova.file.externalRootDirectoryまたはcordova.file.externalRootDirectoryを試してみることができます。また、Android Marshmallowでテストしている場合は、古いバージョンのMarshmallowで問題が発生しているように見えるので、コードバージョンファイルプラグイン(4.2.0)の最新バージョンを使用する必要があります。

+0

アイデアをありがとう、しかし喜びはありません、私は恐れています。 externalRootDirectoryとexternalDataDirectoryの両方で同じエラーが発生し、 'file:/// storage/emulated/0/...'スタイルまたは 'cdvfile:// localhost/sdcard /'をメディアに渡すかどうかに違いはありませんオブジェクト。ちなみに、私はアプリケーションが自分自身のキャッシュディレクトリを読み書きすることができると信じています。それは結局のところ必要です。それが私がやろうとしていることです。私は外部ファイルエクスプローラを使用してファイルを表示しようとしていません。 – Patrick

+0

@パトリック私が言及したように、自分自身がアプリケーションのキャッシュディレクトリに書き込もうとしましたが、コードバファイルプラグインを使って少なくとも私のために働いていました。私はいくつかの分析から、これを行うためにデバイスにルートアクセス権があることを理解しました。私はファイルがファイルエクスプローラ – Gandhi

+0

を使用してデバイスで利用できるかどうかを確認するように頼んだ@ガンジー、アプリケーションのキャッシュディレクトリへの書き込みは私のために働いています。例えば。私は 'cdvfile:// localhost/temporary/test.png'にPNGファイルをダウンロードし、ダウンロードが完了したらそのパスに' img' 'src'タグを設定することでアプリケーションに表示することができます。このファイルは、ファイルエクスプローラを使用して_not_できません。なぜなら、アプリケーションのキャッシュディレクトリはアプリにプライベートであるからですが、これは問題とは無関係です。 – Patrick

関連する問題