8

iOSAndroidの両方で実行する必要があるオンライン ビルド サービスを介してPhoneGapアプリケーションをビルドしようとしていますが、この質問は Android の部分に焦点を当てています。

アプリケーションの主な目的は、ファイルシステムにアクセスして変更できるようにすることです。Raymond Camden のブログ投稿に触発されて、私は彼と非常によく似たサンプル アプリケーションを作成することになりました。これは、読み取り/書き込み権限でファイル システムにアクセスします。主な違いは、SDK をインストールせずに、androidManifes.xmlファイルを気にせずに、アプリケーションをオンラインでビルドすることです。

私の問題は、ファイルシステムにアクセス (ディレクトリの一覧表示、ファイルの読み取り) はできるが、ファイルシステムに何も書き込めないことです。

ファイル アクセス許可を得るために、必要な<feature />タグをconfix.xmlに含めました。

<feature name="http://api.phonegap.com/1.0/file"/>

私のアプリケーションで使用されるサンプルコードは次のとおりです。

ファイル コードの読み取り:

// Request fileSystem
fileSystem.root.getFile(fileName, {create:true}, readFile, onError);

// Function that reads a file
function readFile(file){
    var reader = new FileReader();
    reader.onloadend = function(e) {
        console.log("contents: ", e.target.result);
    }
    reader.readAsText(file);
}

ファイルコードの書き込み/追加:

fileSystem.root.getFile(fileName, {create:true}, function(file){
    file.createWriter(function(writer) {
        writer.onwrite = function() {
            console.log('writing', arguments);
        }

        writer.onerror = function(e) {
            console.error('error', e);
        }

        writer.onwriteend = function() {
            console.log('writeend', arguments);
        }

        //Go to the end of the file...
        writer.seek(writer.length);

        // Append a timestamp
        writerOb.write("Test at "+new Date().toString() + "\n");
    })
}, onError);

2 番目のコード サンプルでは、​​対象のファイルに何も書き込まれておらず、onerrorハンドラーは、NOT_FOUND_ERR. そして、これは意味がありません。なぜなら、同じファイルを読み取ることができるからです (そして、それを見つけることができます)

同様に、新しいファイルを作成しようとすると ( write/append file codeと同じコードを使用しますが、対象のファイルが存在しません)、INVALID_MODIFICATION_ERRエラーが発生します。

公式ドキュメントの例も試してみましたが、同じ結果が得られました (読み取りと書き込みなし)。

PhoneGap は HTML5 ファイルAPIを使用しているため、このスタック オーバーフローの回答(および他のサイト) で提案されているように、ブロブを介してコンテンツを書き込もうとしましたが、うまくいきませんでした。

私は何が欠けていますか?ファイルを書き込むための別のプラグインが必要ですか、それともオンライン ビルド ツールでは実行できず、SDK をダウンロードして昔ながらの方法でアプリケーションをコンパイルする必要がありますか?

PS: 私の PhoneGap のバージョンは2.3.0です。

4

3 に答える 3

3

ファイル システムに書き込む PG ビルドを使用してアプリを作成したので、プラグインを必要とせずに実行できると確信しています。私のコードで見られる主な顕著な違いは、getFile オプションの排他フラグを明示的に false に設定していることです。

iOS でテストしている場合、暗い解決策の別のショットは、config.xml でアプリ ID を正しく設定していることを確認することです。

編集:私が言及したアプリでは、コードを書くファイルシステムがここにあります

于 2013-04-07T03:56:57.500 に答える
0

まず、requestFileSystemを適切な方法で呼び出し、デバイスの準備が整った後に呼び出してください。

function onDeviceReady() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, yourCode, fail);
}

次に、fileNameがパスのないファイルの名前のみであることを確認してください。ディレクトリを使用する場合は、 DirectoryEntryを使用する必要があります。

于 2013-04-12T08:40:51.683 に答える