File log tidak dibuat menggunakan plugin file Cordova di Android Nougat & Marshmallow

Saya menggunakan Plugin File Cordova untuk membuat file log di penyimpanan internal perangkat saya yang menjalankan Nougat. Saya tidak memiliki kartu SD eksternal.

Ini kode saya

function myLogger(logString) {
    alert("Inside mylogger");
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {
        alert("Inside Local File System");
        var absPath = cordova.file.externalRootDirectory;
        var fileDir = cordova.file.externalDataDirectory.replace(cordova.file.externalRootDirectory, '');
        var fileName = "logfile.txt";
        var filePath = fileDir + fileName;
        alert(filePath);
        fs.root.getFile(filePath, {create: true, exclusive: false}, function (fileEntry) {
            alert("Inside getFile method");
            fileEntry.createWriter(function (fileWriter) {
                alert("Inside createwriter method");
                fileWriter.seek(fileWriter.length); // Start write position at EOF.
                var logStringWithTimeStamp = Date.parse(new Date()) + " : " + logString + "\n";
                var blob = new Blob([logStringWithTimeStamp], {type: 'text/plain', endings: 'native'});
                fileWriter.write(blob);
            }, function (err) {
                console.log("Err logString" + err);
            });
        }, function (err) {
            console.log("Err" + err);
        });
    }, function (err) {
        console.log("Err1" + err);
    });
}

myLogger("Hello Logger");

Dalam kode ini saya mendapatkan Kode Kesalahan 9 - INVALID_MODIFICATION_ERR

Saya telah memeriksa berulang kali - kode tidak masuk ke blok fs.root.getFile. Jadi saya mengubah kodenya sedikit.

KODE ALTERNATIF yang tidak memberikan kesalahan tetapi file log tetap tidak dibuat

function myLogger(logString) {
    alert("Inside mylogger");
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {
        alert("Inside Local File System");
        var absPath = cordova.file.externalRootDirectory;
        var fileDir = cordova.file.externalDataDirectory.replace(cordova.file.externalRootDirectory, '');
        var fileName = "logfile.txt";
        var filePath = fileDir + fileName;
        alert(filePath);
        fs.root.getFile(fileName, {create: true, exclusive: false}, function (fileEntry) {
            alert("Inside getFile method");
            fileEntry.createWriter(function (fileWriter) {
                alert("Inside createwriter method");
                fileWriter.seek(fileWriter.length); // Start write position at EOF.
                var logStringWithTimeStamp = Date.parse(new Date()) + " : " + logString + "\n";
                var blob = new Blob([logStringWithTimeStamp], {type: 'text/plain', endings: 'native'});
                fileWriter.write(blob);
            }, function (err) {
                console.log("Err logString" + err);
            });
        }, function (err) {
            console.log("Err" + err);
        });
    }, function (err) {
        console.log("Err1" + err);
    });
}

myLogger("Hello Logger");

Dalam Kode ke-2 saya memberikan fileName sebagai parameter alih-alih filePath dalam metode getFile. Di sini saya tidak mendapatkan kesalahan apa pun tetapi file log tetap tidak dibuat. Saya memiliki semua izin di Android Manifest. Saya juga telah memberikan akses penyimpanan ke aplikasi Ionic Cordova saya. Mengapa saya tidak dapat membuat file log di penyimpanan internal perangkat saya?

Sunting 1: Saya juga sudah mengujinya di Marshmallow. Pada kode ke-2 ini berlaku untuk semua blok, tidak ada kesalahan tetapi file log tetap tidak dibuat


person tommy123    schedule 09.03.2018    source sumber


Jawaban (1)


Masalah utama yang saya lihat dengan implementasi Anda adalah baris ini:

var fileDir = cordova.file.externalDataDirectory.replace(cordova.file.externalRootDirectory, '');

Ini menggantikan jalur absolut dan menjadikannya relatif. Anda kemudian menggunakan ini untuk membuat filePath dan meneruskannya ke fs.root.getFile yang mengharapkan jalur absolut, bukan jalur relatif.

Saya akan melakukannya sedikit berbeda dari pendekatan Anda dan menyelesaikan direktori tempat Anda ingin membuat file kemudian menggunakan entri direktori itu untuk membuat entri file lokal, seperti ini:

function onDeviceReady(){
    myLogger("Hello Logger");
}

function myLogger(logString) {
    var fileDir = cordova.file.externalDataDirectory;
    var fileName = "logfile.txt";
    var filePath = fileDir + fileName;
    window.resolveLocalFileSystemURL(fileDir, function (dirEntry) {
        log("Inside Local File System");

        log("Write to: " + filePath);
        dirEntry.getFile(fileName, {create: true, exclusive: false}, function (fileEntry) {
            log("Inside getFile method");
            fileEntry.createWriter(function (fileWriter) {
                log("Inside createwriter method");

                fileWriter.onwriteend = function () {
                    log("Successfully wrote file");
                };
                fileWriter.onerror = function (e) {
                    error("Failed file write: " + e.toString());
                };

                fileWriter.seek(fileWriter.length); // Start write position at EOF.
                var logStringWithTimeStamp = Date.parse(new Date()) + " : " + logString + "\n";
                var blob = new Blob([logStringWithTimeStamp], {type: 'text/plain', endings: 'native'});
                fileWriter.write(blob);
            }, function (err) {
                error("creating file writer " + JSON.stringify(err));
            });
        }, function (err) {
            error("getting file for writing " + JSON.stringify(err));
        });
    }, function (err) {
        error("requesting filesystem " + JSON.stringify(err));
    });
}

function error(msg){
    log("ERROR: "+msg);
}

function log(msg){
    document.body.innerHTML += '<p>'+msg+'</p>';
}

document.addEventListener('deviceready', onDeviceReady, false);
person DaveAlden    schedule 09.03.2018