SL4A + Intents + Jquery + Webview

Я пишу Android-приложение sl4a с использованием веб-просмотров. Я пытаюсь добиться вызова из веб-просмотра обработчику событий в моем скрипте Python, который запускает намерение выбрать изображение из галереи изображений и отправить путь к изображению в веб-просмотр, чтобы он мог добавить всплывающий экран через основание 5 раскрыть модуль, а также скрытый тег ввода для отправки.

У меня двойная проблема. Я ищу правильный способ зацикливания функции 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)))

2 ответа

Может быть, есть лучший способ, но это сработало для меня.

Он устанавливает неблокирующий цикл с setTimeout(), чтобы ждать, пока пользователь выберет картинку из нативной галереи Android и Python Backend для отправки обратно в веб-просмотр. Все остальное либо не будет перехватывать данные при обратном вызове, так как пользователь еще не выбрал изображение, блокируя 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;
  });
}

Извините, я не знаком с фасадом 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)

Кстати, было бы лучше удалить некоторые логики вне вопросов.

Другие вопросы по тегам