尝试在Android应用程序上传输基于Javascript的网页(同时使用WebView和Context+;doit)。。。不';我无论如何都不工作
我正在开发一个android应用程序,我做得很好,当我需要使用一些JS功能时,几个月前已经在一个网页上成功开发了这些功能(所以这是一个包含JS功能的HTML页面),但是没有办法让它们在android上工作 我尝试了上下文,这样:尝试在Android应用程序上传输基于Javascript的网页(同时使用WebView和Context+;doit)。。。不';我无论如何都不工作,javascript,android,html,webview,Javascript,Android,Html,Webview,我正在开发一个android应用程序,我做得很好,当我需要使用一些JS功能时,几个月前已经在一个网页上成功开发了这些功能(所以这是一个包含JS功能的HTML页面),但是没有办法让它们在android上工作 我尝试了上下文,这样: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); doit( "MY JAVASCRIPT HERE"
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();
}
}
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);
}
}
通过WebView,可以这样:
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();
}
}
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);
}
}
以下是HTML代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<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>
在最近的WebView(更具体地说是Chromimum WebView)中,常规javascript已经失效。 您可以通过以下方式实现所需的效果: 1) 首先,确保启用了javascript。我还建议您在webview设置中浏览可用的方法,因为您可能会在其中找到更多常用和必需的内容:
webview.getSettings.setJavaScriptEnabled(true)
2) 从4.4开始,您可以通过evaluateJavascript()来执行此操作,它将异步调用javascript并为您提供回调:
String exampleScript = "(function() { return \"example\"; }) ();"
webView.evaluateJavascript(exampleScript, new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Prints 'this'
}
});
String exampleScript=“(函数(){return\'example\”;})(;”
evaluateJavascript(示例脚本,new ValueCallback(){
@凌驾
公共void onReceiveValue(字符串s){
Log.d(“LogName”,s);//打印“this”
}
});
3) 在4.4之前,您可以使用所描述的JavaScriptInterface。请注意额外的@JavascriptInterface注释,这是intrface在post SDK17设备上正常工作所必需的。请提交日志cat输出,您将得到哪个错误