2015-12-12 45 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; 
    }); 
}