2015-12-12 47 views
0

我正在写sl4a android应用程序利用webviews。我试图从webview调用我的python脚本中的事件处理函数,该函数启动一个意图,从图像库中选择图像并将图像路径发送回webview,以便它可以通过基础附加到弹出屏幕5显示模块以及隐藏的输入标签提交。SL4A +内容+ Jquery + Webview

我遇到的问题是双重的。我正在寻找循环registerCallback函数的正确方法,直到用户点击一张照片并从python返回值,即用户决定选择哪张图片时无限期。到目前为止,如果没有睡眠或setTimeout循环,它会在事件发生之前寻找事件。而且,由匿名函数分配的url变量在通过if/else语句时未被确认。我知道这应该是一个范围问题,但我不确定我做错了什么。

jQuery代码

var picInc = 0; 
var url = undefined; 

$(function(){ 
    $('#picSelect').click(function(){ 
    picInc += 1; 
    droid._pickPic(); 
    while(url == undefined){ 
    sleep(3000); // maybe setTimeout(function{ null function}, 1000); 
    droid.registerCallback('picSelect', function(msg){ 
     url = msg.data; 
    }); 
    } 
    if(url == 'None'){ 
    url = undefined; 
    }else{ 
    var strip = url.split('\\').pop().split('/').pop(); 
    $('.PICADD').append(' /* add img tag with image path */ '); 
    url = undefined; 
    } 
    }); 
    }); 

Python代码

while True: 
    event = droid.eventWait().result 
    name = event['name'] 
    data = event['data'] 
    if event['data'] == 'PIC': 
     activity = droid.startActivityForResult('android.intent.action.GET_CONTENT', None, 'image/*') #, {'android.intent.action.extra.ALLOW_MULTIPLE': True} 
     if activity.result == None: 
      droid.eventPost('picSelect', 'None') 
     else:  
      result = activity.result['data'] 
      parsedUriPath = droid.queryContent(result) 
      cleanParsed = parsedUriPath.result[0]['_data'] 
      droid.eventPost('picSelect', '{}'.format(str(cleanParsed))) 

回答

0

对不起,我不是在SL4A和下面的例子熟悉webView的门面是伪代码。

你看过https://github.com/kuri65536/sl4a/blob/master/docs/UsingWebView.md吗? 该文件描述回调函数,你的代码可能是:

var droid = new Android(); 
function func_callback(msg) { 
    if (msg.data == 'None') {return;} 
    $('.PICADD').append(' /* add img tag with image path from msg.data */ '); 
} 

$(function(){ 
    droid.registerCallback('pic_select_js', func_callback); 
    $('#picSelect').click(function() { 
    droid.postEvent("pic_select_py"); 
    }); 
}); 

蟒蛇方:

import android 
droid = android.Android() 
droid.webViewShow('file:///sdcard/sl4a/scripts/sample.html') 
while True: 
    droid.waitForEvent('pic_select_py') 
    url = "/where/to/pic.png" 
    droid.postEvent('pic_select_js', url) 

顺便说一句,这可能是较好的去除一些逻辑之外的问题。

+0

这似乎是它的工作,虽然我找到了一个解决方案而回,忘了将它张贴。谢谢。我也想感谢你维护SL4A存储库并将python构建转换为PIE,以便我们可以在android-python27上使用棒棒糖和超越。如果您正在寻找贡献者,请告诉我。 –

0

也许有更好的办法,但这对我有用。

它使用setTimeout()设置非阻塞循环,以等待用户从本机android图库和python后端选择图片发送回webview。其他任何事情都不会在回调中捕获数据,因为用户还没有选择图片,阻塞带有睡眠功能的js,或者它会在下一个图片选择上收集数据,导致选择的最后一个项目永远不会被回调插入到html中用于在自定义弹出式库中提交或查看。

jQuery的

$(function(){ 
    $('#picSelect').click(function(){ 
    droid._pickPic(); 
    waitForElement(); 
    }); 
}); 

function waitForElement(){ 
    if(typeof uri !== "undefined"){ 
    if(uri === 'None'){ 
     uri = undefined; 
     return false; 
    } 
    else{ 
     var strip = uri.split('\\').pop().split('/').pop(); 
     $('#pictures').append(' /* add img tag with image path */ '); 
     uri = undefined; 
     return true; 
    } 
    } 
    else{ 
    setTimeout(function(){ 
     callBack(); 
     waitForElement(); 
    }, 1000); 
    } 
} 

function callBack() { 
    droid.registerCallback('picSelect', function(msg){ 
    uri = msg.data; 
    }); 
}