まあ、私は困惑しています。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ファイルを開くことに関するものです。
cdvfile url(file:///data/data/com.example.media_test/cache/test.mp3)ではなく、ファイルurlから再生するとどうなりますか? – user3791775
質問していただきありがとうございます - まったく同じことが起こります! – Patrick