Gio Venice
- Post del forum: 1
27 ago 2014, 14:09:03 Tramite pagina web
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 è + 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!
Contenuti editoriali consigliati
Con il vostro consenso, qui vengono caricati contenuti esterni.
Facendo clic sul pulsante qui sopra, l'utente accetta che vengano visualizzati contenuti esterni. I dati personali possono essere trasmessi a fornitori terzi. Per ulteriori informazioni al riguardo, consultare il nostro sito Informativa sulla privacy.