【Monaca】cordovaプラグインの動作は実機で確認しよう!【初心者】

この記事は最終更新から3年以上が経過しています。情報が古くなっている可能性があります。
だいぶ初歩的な話になります。Monacaアプリ開発中こんなことがありましたのでさっくり覚書き。
あっMonacaのメディアプラグイン、実機デバッガーじゃないと音ならないんだ。ずっとchromedevツールのコンソール見てたから気づかなくてplayエラーと戦ってた(Д;)オゥフ…
— bicott (@xxbicott) 2018年2月2日
「Uncaught TypeError: Cannot read property ‘play’ of null」エラーに遭遇
MonacaでMediaプラグイン(cordova-plugin-media)を使用して音楽を再生させようとしたところ、chromeのdevツールのconsoleに
「Uncaught TypeError: Cannot read property ‘play’ of null」
というエラーがでていて、音楽が再生できませんでした。
コードは公式にあるものそのまま使用。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<!--<meta http-equiv="Content-Security-Policy" content="default-src * data: gap: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">-->
<script src="components/loader.js"></script>
<link rel="stylesheet" href="components/loader.css">
<link rel="stylesheet" href="css/style.css">
<script>
var media = null;
var mediaTimer = null;
var srcFile = "test.mp3";
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
console.log("ready");
media = new Media (getPath() + srcFile , onSuccess, onError);
}
function getPath() {
var str = location.pathname;
var i = str.lastIndexOf('/');
return str.substring(0,i+1);
}
function playSound(){
// play the media file one time.
media.play({numberOfLoops: 0});
// start the timer
if (mediaTimer == null) {
mediaTimer = setInterval(function() {
// Return a current playback position
media.getCurrentPosition(
//A Callback function if it's success
function(position) {
if (position > -1) {
//If the playback stops at "-0.001" position, set the timer to 0.
if(position == -0.001){
position = 0;
}
setAudioPosition((position) + " sec");
}
},
//A callback function in case of failure
function(error) {
console.log("Error getting pos=" + error);
setAudioPosition("Error: " + error);
}
);
}, 1000);
}
}
function pauseSound(){
if (media) {
media.pause();
}
}
function stopSound(){
if (media) {
media.stop();
}
}
function setAudioPosition(position) {
document.getElementById('audio_position').innerHTML = position;
}
function onSuccess(){
console.log("Successfully initialize a media file.");
}
function onError(error){
console.log("Failed to initialize a media file. [ Error code: " + error.code + ", Error message: " + error.message + "]");
}
</script>
</head>
<body style="text-align: center">
<h1>Playing Sound</h1>
<button onclick="playSound()">Play</button>
<button onclick="pauseSound()">Pause</button>
<button onclick="stopSound()">Stop</button><br />
<p id="audio_position"></p>
</body>
</html>
引用元)音楽の再生方法 > 音の再生 ( Monaca プロジェクト内の音源を使用 )
このエラーが表示される際、その前に発火されるはずの17行目console.log(“ready”)が表示されていないことに気づきました。
“deviceready”はcordovaが読み込み完了してから発火されるらしい。
つまりcordovaが読み込めてない・・!?
あっこんな記事まであるぞ!?
とまで燃え上がった後…
ふと実機でみたら動いた。
cordovaは実機で確認しようね
以下公式HPです。
Cordova の読み込みが完了するまで、デバイス系の API は使用できません。そこで重要となるのが onDeviceReady() 関数です。この関数は、Cordova の読み込み完了後に実行される関数です。
ここでは、デバイス系の API を使用して、カメラ機能を起動するコードを例にしてみます。Monaca クラウド IDE 上のプロジェクトに、次の内容をコピー&ペーストして、 Monaca デバッガー 上で実行してみましょう。
引用元)Cordova の読み込み
ということだそうです。
上記を読んで「Monaca デバッガー上で実行しよう(プレビューでも動くけどデバッガーの方がよりちゃんと確認できるからね)」と勝手に解釈していました。
それかどこかに「プレビュー上じゃ動かない」と明記されてたのかな、気づきませんでした。
また、先ほどの17行目console.log(“ready”)ですが、Monacaのデバッグパネルを見たところちゃんと出力されてました。
あ、このデバッグパネル実機と繋いで使うんですね。。(´∀`;)
通常console.logと記載した場合はdevツールのconsoleの方に出力されるのでデバッグパネル自体非表示にしてました。(チュートリアル見てない)
Monaca デバッガーと Monaca クラウド IDE を併用して、デバッグを行う手順を、次に記します。
- Monaca クラウド IDE 上で、プロジェクトを開きます。
- Monaca デバッガー上で、プロジェクトを実行します。
- IDE と端末が接続されていることを確認します。デバッグパネル上に、端末情報が表示されていれば、接続されています ( 下のスクリーンショットを参照のこと )。表示されない場合、IDE またはデバッガーをいったんリフレッシュさせます。IDE と端末の接続後に、アプリのデバッグを IDE 上で行えます。
引用元)Monaca デバッグパネル
あれ、超便利
チュートリアルはしっかり見ようと決意しました。
cordovaプラグインを使った機能は実機デバッガーじゃないとうまく動かないので、実機で確認しましょう。
おまけ
こちらはDevicereadyが発火されないケースがあるというもの。(2011年の記事です)
同じことが起きた時は参考にさせていただきます。