2015-12-12 3 views
0

Я пишу приложение для Android с Android, используя веб-просмотры. Я пытаюсь выполнить вызов из веб-браузера в обработчик события в моем сценарии python, который запускает намерение выбрать изображение из галереи изображений и отправить путь изображения к веб-просмотру, чтобы он мог присоединяться к всплывающему экрану через основание 5, а также скрытый тег ввода для отправки.SL4A + Intents + 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

К сожалению, я не знаком с WebView фасада в SL4A и ниже примерах, псевдо-код.

Вы прочитали: 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 backend для отправки обратно в 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; 
    }); 
}