0

Web アプリのデバッグ:

Android の WebKit は、他のデスクトップ ブラウザーで使用できるすべてのコンソール API を実装しているわけではありません。ただし、基本的なテキスト ロギング機能は使用できます。

console.log(String)
console.info(String)
console.warn(String)
console.error(String)

他のコンソール機能ではエラーは発生しませんが、他の Web ブラウザーに期待するものと同じように動作しない可能性があります。


android.webkit.ConsoleMessage.MessageLevel :

ConsoleMessage.MessageLevel DEBUG
ConsoleMessage.MessageLevel エラー
ConsoleMessage.MessageLevel ログ
ConsoleMessage.MessageLevel ヒント
ConsoleMessage.MessageLevel 警告


特に Android デバイス用の webapp-native-hybrid を開発しているときに、JavaScript コンソールを通常の LogCat とマージできてうれしかったです。しかし、なんと残念なことでしょう: MessageLevel.INFO になる console.debug があり、console.verbose() はまったくありません (エラーがスローされます)。

4

1 に答える 1

2

これを解決するために、コンソールの機能を単純な (そして本当に見苦しく不安定な) アダプターで拡張します。

var c = window.console;
window.console = {
    debug:   function(message) { c.error("(DEBUG)#" + message); },
    verbose: function(message) { c.error("(VERBOSE)#" + message); },
    error:   function(message) { c.error(message); },
    warn:    function(message) { c.warn(message); },
    log:     function(message) { c.log(message); },
    info:    function(message) { c.info(message); }
};

for (i in c) {
    try {
        window.console[c[i]]();
    } catch(error) {
        if(verbose) console.verbose("Funktion nicht implementiert: " + c[i]);
        window.console[c[i]] = function(arguments) {
            if(debug) console.debug("Aufruf nicht implementierter Funktion: " + this);
            var funcDefArray = ("" + this).split(" ");
            c[funcDefArray[1]](arguments);
        };
    }
}

(DEBUG)#このアダプターは、プレフィックスを追加するか(VERBOSE)#、パラメーターとして指定されたメッセージにログ機能を追加し、error()元のコンソール オブジェクトから呼び出します。うまくいけば、これが最も使用頻度の低いレベルになるので、ここで着信メッセージのプレフィックスをチェックします。LogCat の目的のログ レベルは、抽出されたプレフィックスによって選択されます。

public class CustomWebChromeClient extends WebChromeClient {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
    String tag = TAG_JS;
    StringBuffer message = new StringBuffer(consoleMessage.message());

    MessageLevel lvl = consoleMessage.messageLevel();
    if (lvl == MessageLevel.ERROR) {
        int i = message.indexOf(")#");
        if(i > 0 && i < 8) {
            String realLevel = message.substring(1, i);
            message.replace(0, i+2, "");
            if("DEBUG".equals(realLevel)) lvl = MessageLevel.DEBUG;
            else if("VERBOSE".equals(realLevel)) lvl = MessageLevel.TIP;
            else tag += " (" + realLevel + ")";
        } else {
            String source = consoleMessage.sourceId();
            source = source.substring(source.indexOf("/js/") + 1);
            message.append(source);  
            message.append('(').append(consoleMessage.lineNumber()).append(')');
            message.append(" –&gt; ");
        }
    }

    message.append(consoleMessage.message());
    switch (lvl) {
    case ERROR:
        Log.e(tag, message.toString());
        break;
    case WARNING:
        Log.w(tag, message.toString());
        break;
    case LOG:
        Log.i(tag, message.toString());
        break;
    case DEBUG:
        Log.d(tag, message.toString());
        break;
    case TIP:
        Log.v(tag, message.toString());
        break;
    default:
        Log.println(Log.ASSERT, tag, message.toString());
        break;
    }
    return true;
}
}

プロトタイプでコンソール機能を操作しようとしましたが、現時点では、動作する結果を得るにはそれほど慣れていません。私の目的ではそれで十分であり、最終的には他の誰かがこのがらくたを使用できます。

誰かがプロトタイピングの数行を提供してくれたら嬉しいですし、次にこのようなものが必要になったときには自分でできるようになることを願っています ;)

于 2012-11-04T19:24:25.390 に答える