質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

3回答

5200閲覧

cordovaプラグインを有効にする方法が知りたいです

yue_ohashi

総合スコア8

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

0クリップ

投稿2017/01/30 14:11

###前提・実現したいこと
monacaのクラウドIDEを利用しています。
音楽プレイヤーを作ろうとしていて、外部ファイルを読み込みたいのでcordovaのFileプラグインが使いたいです。
クラウドIDEでプラグインを有効にしても下記のエラーが出ます。
開発環境を変えてプラグインを有効にするとエラーが出ないようです。
開発環境は変えたくないのですが、クラウドIDE以外の方法でcordovaプラグインを有効にする方法はあるでしょうか?

###発生している問題・エラーメッセージ
cordovaプラグインのFileを有効にしているのですが、Uncaught TypeError: window.requestFileSystem is not a functionと出ます。

###該当のソースコード

<!DOCTYPE HTML> <html id="myApp"> <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:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"> <script src="lib/angular/angular.min.js"></script> <script src="lib/onsenui/js/onsenui.min.js"></script> <script src="lib/onsenui/js/angular-onsenui.min.js"></script> <script src="components/loader.js"></script> <link rel="stylesheet" href="components/loader.css"> <link rel="stylesheet" href="lib/onsenui/css/onsenui.css"> <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css"> <link rel="stylesheet" href="css/style.css"> <script> document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { //alert("Fileプラグインが利用できます。"); window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; //window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, success, error); var grantedBytes = 0;// 1024*1024*10; // 10MB window.requestFileSystem(PERSISTENT, grantedBytes, /*$scope.*/fileSystemReceived, /*$scope.*/errorHandler); } myApp = ons.bootstrap(); myApp.controller('AppController', function($scope) { this.load = function(page) { $scope.splitter.content.load(page); $scope.splitter.left.close(); }; this.toggle = function() { $scope.splitter.left.toggle(); }; }); myApp.controller("SampleController", ["$scope", "FileSystem", function($scope, FileSystem){ FileSystem.getFileSystem() .then(function(fs){ $scope.ROOT_PATH = fs.root.toURL(); /* ルートへのパスを取得 */ }, function(error){ alert("エラーです"); }); $scope.fileSystemReceived = function (fileSystem) { fileSystem.root.getFile("souvenirs.json", { create: true, exclusive: false }, $scope.fileEntryReceived, $scope.errorHandler); } $scope.fileEntryReceived = function (fileEntry) { fileEntry.createWriter($scope.fileWriterReceived, errorHandler); } $scope.fileWriterReceived = function (fileWriter) { var listeSouvenirsText = angular.toJson($scope.listeSouvenirs); fileWriter.write(listeSouvenirsText); } $scope.errorHandler = function (error) { console.log(error); } }]); myApp.factory("FileSystem", ["$q", function($q){ return { getFileSystem: function(){ let deferred = $q.defer(); //window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; /* var requestedBytes = 1024*1024*10; // 10MB navigator.webkitPersistentStorage.requestQuota ( requestedBytes, function (grantedBytes) { window.requestFileSystem(PERSISTENT, grantedBytes, $scope.fileSystemReceived, $scope.errorHandler); }, $scope.errorHandler ); */ window.requestFileSystem(window.PERSISTENT, 0, function(filesystem){ deferred.resolve(filesystem); }, function(error){ deferred.reject(error); }); return deferred.promise; } }; }]); function errorHandler(error) { console.log(error); } function fileSystemReceived(fileSystem) { fileSystem.root.getFile("souvenirs.json", { create: true, exclusive: false }, $scope.fileEntryReceived, $scope.errorHandler); } ons.ready(function() { //console.log("Onsen UI is ready!"); //window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; }); </script> </head> <body> <ons-splitter ng-controller="AppController as app" var="splitter"> <ons-splitter-side side="left" width="220px" collapse swipeable> <ons-page> <ons-list> <ons-list-item ng-click="app.load('home.html')" tappable> Home </ons-list-item> <ons-list-item ng-click="app.load('settings.html')" tappable> Settings </ons-list-item> <ons-list-item ng-click="app.load('about.html')" tappable> About </ons-list-item> </ons-list> </ons-page> </ons-splitter-side> <ons-splitter-content page="home.html"></ons-splitter-content> </ons-splitter> <ons-template id="home.html"> <ons-page> <ons-toolbar> <div class="left"> <ons-toolbar-button ng-click="app.toggle()"> <ons-icon icon="md-menu"></ons-icon> </ons-toolbar-button> </div> <div class="center"> Main </div> </ons-toolbar> <p style="text-align: center; opacity: 0.6; padding-top: 20px;"> Swipe right to open the menu! </p> </ons-page> </ons-template> <ons-template id="settings.html"> <ons-page> <ons-toolbar> <div class="left"> <ons-toolbar-button ng-click="app.toggle()"> <ons-icon icon="md-menu"></ons-icon> </ons-toolbar-button> </div> <div class="center"> Settings </div> </ons-toolbar> </ons-page> </ons-template> <ons-template id="about.html"> <ons-page> <ons-toolbar> <div class="left"> <ons-toolbar-button ng-click="app.toggle()"> <ons-icon icon="md-menu"></ons-icon> </ons-toolbar-button> </div> <div class="center"> About </div> </ons-toolbar> </ons-page> </ons-template> <ons-template ng-controller="SampleController"> <ons-page> <ons-toolbar> <div class="center">Test</div> </ons-toolbar> <h1>てすと</h1> <span>{{ROOT_PATH}}</span> </ons-page> </ons-template> </body> </html>

###補足情報(言語/FW/ツール等のバージョンなど)
実行環境はandroidです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

解決したわけではありませんが、クラウドIDEでcordovaプラグインをどうこうではなく、Onsen UI V2 Angular 1 Splitterだと上記の現象が出るようだと分かりました。
Onsen UI V2 Angular 1 Tabbarだと大丈夫なようなので、とりあえずそちらで作業を進めたいと思います。

投稿2017/02/03 13:37

yue_ohashi

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まずクラウドIDEの問題かどうかという点ですと、クラウドIDEの問題ではないと思います。
下記コードはOnsenUI2 + AngularJS1のMinimum Templateに多少手を加えたものですが、 window.requestFileSystemでは問題発生していません。

HTML

1 2<!DOCTYPE HTML> 3<html> 4<head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 7 <meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"> 8 <script src="components/loader.js"></script> 9 <script src="lib/angular/angular.min.js"></script> 10 <script src="lib/onsenui/js/onsenui.min.js"></script> 11 <script src="lib/onsenui/js/angular-onsenui.min.js"></script> 12 13 <link rel="stylesheet" href="components/loader.css"> 14 <link rel="stylesheet" href="lib/onsenui/css/onsenui.css"> 15 <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css"> 16 <link rel="stylesheet" href="css/style.css"> 17 18 <script> 19 ons.bootstrap() 20 .controller('HelloController', function() { 21 this.world = 'World'; 22 }); 23 ons.ready(function() { 24 25 window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail); 26 27 console.log("Onsen UI is ready!"); 28 }); 29 30 31 function onFileSystemSuccess(fileSystem) { 32 console.log(fileSystem.name); 33 } 34 35 function onResolveSuccess(fileEntry) { 36 console.log(fileEntry.name); 37 } 38 39 function fail(evt) { 40 console.log(evt.target.error.code); 41 } 42 43 </script> 44</head> 45<body> 46 <ons-page ng-controller="HelloController as hello"> 47 <ons-toolbar> 48 <div class="center">Introduction</div> 49 </ons-toolbar> 50 51 <div class="content" style="margin: 10px;"> 52 <p>What is your name?</p> 53 <p> 54 <ons-input modifier="underbar" ng-model="hello.world" placeholder="Your name" float></ons-input> 55 </p> 56 <p> 57 Hello, {{ hello.world || 'stranger' }}! 58 </p> 59 </div> 60 </ons-page> 61</body> 62</html> 63 64

一方、yue_ohashiさんのコードでご提示通りの問題が発生していることは確認していて、なんとか動くように修正しようとしたのですが、時間も限られる中ですので修正までは出来ませんでした。
申し訳ないです。

ちなみに、
MonacaクラウドIDEの仕組みとしては、設定画面からCordovaプラグインの管理→Fileを有効にすると、プロジェクト内のloader.jsが自動的に変更され、GUI上で選んだプラグインがプロジェクト内で有効になるような動きをします。
Monacaデバッガーを利用してデバッグをされている場合、基本プラグインは全て含まれる状態でプロジェクトが動作します。
もし暗黙的に利用している(設定で有効化していないが利用している)プラグインがある場合、ビルド時には有効化したプラグインしかビルド対象になりませんので、エラーとなります。
デバッガーに既に含まれているためにデバッガーでは動いてしまうが、ビルドするとプラグインが見つからず動かないということです。

投稿2017/02/01 05:46

akabee

総合スコア1947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yue_ohashi

2017/02/01 14:59

ありがとうございます。 OnsenUI2 + AngularJS1のSlid?Splitter? Templateから始めた記憶があります。 OnsenUI2 + AngularJS1のMinimum Templateから始めたら問題がないのでしょうか? 自力で解決できる気がしないので、スタートを変えてうまくいくなら試してみたいと思います。 (それでうまくいって現ソースのエラーがわかれば万々歳です)
guest

0

当該のメソッド window.requestFileSystemは、cordova-plugin-fileに含まれているようです。
cordovaでの開発でしたらプロジェクト内で以下のコマンドで登録可能です...

cordova plugin add cordova-plugin-file

File - Apache Cordova

しかし、monaca とのことですので以下の手順で登録可能です。

Adding the Plugin in Monaca

In order to use this plugin, please enable File plugin in Monaca Cloud IDE.

File Plugin - Monaca Docs

File pluginを有効にすれば可能なようですよ

投稿2017/01/30 14:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yue_ohashi

2017/01/30 14:38

回答ありがとうございます。 クラウドIDEでFile pluginを有効にしていてもエラーが出るので、クラウドIDEの不具合ではないかと思って問い合わせてはいます。 例えばcordova plugin add cordova-plugin-fileを実行したプロジェクトを、クラウドIDEで読み込むことはできるのでしょうか?
退会済みユーザー

退会済みユーザー

2017/01/30 14:51

私は基本、cordovaをローカルで利用していますので、monaca クラウドIDEにはうといですが、Monaca LocalKitを利用すると、クラウドIDEからローカルへの移行が可能なのは知っていますが、逆が出来たか正直わかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問