Codice Javascript in applicazione android... provato Context, WebView... niente! HELP!

  • Risposte:0
Gio Venice
  • Post del forum: 1

27 ago 2014, 14:09:03 Tramite pagina web

Ciao a tutti!
Sto sviluppando un'applicazione android. A un certo punto ho avuto bisogno di utilizzare alcune funzioni Javascript, che già da mesi erano state sviluppate correttamente in una pagina web (cioè una pagina HTML con le funzioni all'interno), ma non c'è stato verso di farle funzionare in android.

Ho provato utilizzando un Context, in questo modo:

  public void onCreate(Bundle savedInstanceState)
  {
  super.onCreate(savedInstanceState);

    doit(
            "MY JAVASCRIPT HERE"
           +"AND HERE"
           +"AND HERE"
           +"AND SO ON";
         );
}

void doit(String code)
{
    // Create an execution environment.
    Context cx = Context.enter();

    // Turn compilation off.
    cx.setOptimizationLevel(-1);

    try 
    {
        // Initialize a variable scope with bindnings for  
        // standard objects (Object, Function, etc.)
        Scriptable scope = cx.initStandardObjects();

        // Set a global variable that holds the activity instance.
        ScriptableObject.putProperty(
            scope, "TheActivity", Context.javaToJS(this, scope));

        // Evaluate the script.
        cx.evaluateString(scope, code, "doit:", 1, null);            
    } 
    finally 
    {
        Context.exit();
    }
}

e tramite una WebView, in quest'altro modo:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.google_graph);
    WebView webview = (WebView) findViewById(R.id.webView12);
    String content = "MY HTML CODE HERE"
                    +"AND HERE"
                    +"AND SO ON";

    WebSettings webSettings = webview.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webview.requestFocusFromTouch();
    webview.loadDataWithBaseURL( "file:///android_asset/", content, "text/html", "utf-8", null );
    //webview.loadUrl("file:///android_asset/Code.html"); // Can be used in this way too.
    }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.Cognome_input:
        Intent intent = new Intent(GoogleGraph.this, GoogleImageGraphActivity.class);
        startActivity(intent);
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}

Questo invece è il codice della pagina HTML, perfettamente funzionante:

<html>
<head>

<script type="text/javascript">

    var dHOST                       = "ws://10.0.0.1:8080";

    var dCONNESSIONE_CHIUSA         = 1;
    var dCONNESSIONE_INAPERTURA     = 2;
    var dCONNESSIONE_APERTA         = 3;
    var dCONNESSIONE_LOGININCORSO   = 4;
    var dCONNESSIONE_ATTIVA         = 5;

    var dAUTOMATICO = true;
    var dLOGINAUTO  = dAUTOMATICO;

    var connection = null;
    var connectionOpen = false;
    var ultimaStringa = null;
    var stato;

    // definisco prototipo per usare startsWith che &egrave; + chiara
    if (typeof String.prototype.startsWith != 'function') {
        String.prototype.startsWith = function (str){

            return this.slice(0, str.length) == str;
        };
    }

    aggiornaStato( dCONNESSIONE_CHIUSA );

    function aggiornaInfoStato( stringa )
    {
        document.getElementById("stato").innerHTML = stringa;
    }
    function aggiornaStato( nuovostato )
    {

        if ( ! document.getElementById("stato") ) {
            return;
        }

        if ( nuovostato ) {
            stato = nuovostato;
        }

        if ( stato == dCONNESSIONE_CHIUSA ) {
            aggiornaInfoStato( "non connesso" )
            document.getElementById("btnConnetti").value = " connetti ";
        }
        else if ( stato == dCONNESSIONE_INAPERTURA ) {
            aggiornaInfoStato( "<span style='color:navy'>connessione in corso ...</span>" );
            if ( document.getElementById("infopiano") ) {
                document.getElementById("infopiano").value = "";
            }
        }
        else if ( stato == dCONNESSIONE_APERTA ) {
            aggiornaInfoStato( "<span style='color:green'>CONNESSO ( login NON effettuato )</span>" );
            document.getElementById("btnConnetti").value = " disconnetti ";
        }
        else if ( stato == dCONNESSIONE_LOGININCORSO ) {
            aggiornaInfoStato( "<span style='color:navy'>login in corso ...</span>" );
        }
        else if ( stato == dCONNESSIONE_ATTIVA ) {
            aggiornaInfoStato( "<span style='color:green'>ATTIVA</span>" );
            if (document.getElementById("btnLogin")) document.getElementById("btnLogin").value = " riceProd ";
        }

        if ( stato == dCONNESSIONE_APERTA )
            if (document.getElementById("btnLogin")) document.getElementById("btnLogin").value = " login ";
        else
            if (document.getElementById("btnLogin")) document.getElementById("btnLogin").value = " [disabled] ";

    }
    function connetti()
    {

        //alert( document.getElementById("userid").value );

        if ( !connection ) {

            aggiornaStato( dCONNESSIONE_INAPERTURA );

            connection = new WebSocket( dHOST );

            connection.onopen = function () {
                console.log("connesso");
                aggiornaStato( dCONNESSIONE_APERTA );
                if ( dLOGINAUTO || dAUTOMATICO ) {
                    login();
                }
            };

            connection.onclose = function (event) {
                console.log("connessione chiusa");
                if ( stato == dCONNESSIONE_CHIUSA ) {
                    // mi arriva dopo ca. 10" (Chrome) o 15" (IE) che ho inviato connection.close()
                }
                else if ( stato <= dCONNESSIONE_INAPERTURA ) {
                    aggiornaInfoStato( "<span style='color:red'>connessione fallita</span>" );
                }
                else {
                    aggiornaInfoStato( "<span style='color:red'>connessione interrotta</span>" );
                }
                stato = dCONNESSIONE_CHIUSA;
                connection=null;
            }

            connection.onerror = function (error) {
                console.log('errore: ' + error);
                if ( stato == dCONNESSIONE_CHIUSA ) {
                    // IE: mi arriva dopo 10"/15" che ho inviato connection.close()
                }
                else if ( stato >= dCONNESSIONE_ATTIVA ) {
                    aggiornaInfoStato( "<span style='color:red'>connessione interrotta (err)</span>" );
                }
                else {
                    aggiornaInfoStato( "<span style='color:red'>connessione fallita (err)</span>" );
                }
                connection=null;
                stato = dCONNESSIONE_CHIUSA;
            };

            connection.onmessage = function (e) {
                var stringa = e.data;

                console.log('ricevuto: ' + stringa);

                // gestione dei msg ricevuti
                if ( stringa=='login: ok' ) {
                    aggiornaStato( dCONNESSIONE_ATTIVA );
                    if ( dAUTOMATICO ) {
                        aggiornaInfoStato( "<span style='color:navy'>richiesta in corso ...</span>" );
                        login();
                    }
                }

                else if ( ultimaStringa.startsWith('riceprod: ') ) {

                    var aArray = JSON.parse(stringa);

                    alert( aArray.length );

                    alert( aArray[ 0 ] );

                    alert( aArray[ 0 ][ 0 ] );


                }


                else if ( stringa.startsWith('infopiano: ') ) {
                    var aArray = JSON.parse( stringa.substr(11) );
                    document.getElementById("infopiano").value = aArray[ 0 ];
                    aggiornaStato( dCONNESSIONE_ATTIVA );
                    if ( dAUTOMATICO ) {
                        connetti();
                    }
                }

            };
        }
        else {

            aggiornaStato( dCONNESSIONE_CHIUSA );
            connection.close();
            connection=null;

        }

    }
    function send( stringa )
    {
        if ( stato >= dCONNESSIONE_APERTA ) {
            connection.send( stringa );
            ultimaStringa=stringa;
        }
    }
    function login()
    {

        if ( stato == dCONNESSIONE_APERTA ) {

            aggiornaStato( dCONNESSIONE_LOGININCORSO );

            var userid  = document.getElementById("userid").value;
            var userpwd = document.getElementById("pwd").value;

            send( "login: ['" + userid + "','" + userpwd + "','WebSocketApp']" );

        }
        else if ( stato == dCONNESSIONE_ATTIVA ) {

            aggiornaStato( dCONNESSIONE_ATTIVA );
        }

    }

</script>
</head>

<body>
<center>

<table>
    <tr>
        <td colspan='2'><hr></td>
    </tr>
    <tr>
        <td width='100'>stato</td><td width='300'><span id='stato'>non connesso</span></td>
    </tr>
    <tr>
        <td colspan='2'><hr></td>
    </tr>
    <tr>
        <td>user</td><td><input type='text' id='userid' value='demo_ws_userid'></td>
    </tr>
    <tr>
        <td>pwd</td><td><input type='text' id='pwd' value='demo_ws_pwd'></td>
    </tr>
    <tr>
        <td colspan='2'><hr></td>
    </tr>
    <!--
    <tr>
        <td>id piano</td><td><input type='text' id='idpiano' value=''></td>
    </tr>
    -->
    <!--
    <tr>
        <td>residuo piano</td><td><input type='text' id='infopiano' value=''></td>
    </tr>
    <tr>
        <td colspan='2'><hr></td>
    </tr>
    -->
    <tr>
        <td><input type='button' id='btnConnetti' value=' connetti ' onclick='connetti();'></td>
        <td><input type='button' id='btnLogin' value=' login ' onclick='riceProd();'></td>
    </tr>
</table>

</center>
</body>
</html>

In android ho provato a fare mille debug, anche a collaudare le funzioni una per una, a eliminare le righe una per una, ma non c'è stato verso...
AIUTO!
Grazie a tutti e buona programmazione!

Rispondere