Приложение Nativescript не открывает средство выбора файлов в WebView

У меня есть приложение Nativescript с WebView. Эти WebView открывают URL-адрес, и этот URL-адрес имеет файл типа ввода. Когда я касаюсь этого входа, ничего не происходит. Я пытаюсь расширить класс WebChromeClient, вызывается метод onShowFileChooser, но ничего не происходит.

let myWebChromeClientClass = android.webkit.WebChromeClient.extend({
          onShowFileChooser: function (WebView, ValueCallback, FileChooserParams) {
            console.log("onShowFileChooser");
           // What i have to do here?
          }
        });
        let myWebChromeClient = new myWebChromeClientClass();
 webview.android.setWebChromeClient(myWebChromeClient);

Я не знаю, что мне делать.


person touchmx    schedule 11.12.2019    source источник


Ответы (2)


Проблема в том, что WebView очень ограничен. Но вы можете использовать плагин для вызова средства выбора файлов. В моем решении я использовал плагин imagepicker. Полный код:

fileCallback(filePathCallback) {
        console.log("fileCallback");
        let context = imagePicker.create({
          mode: "single",
          mediaType: imagePicker.ImagePickerMediaType.Any
        });
        return this.startSelection(context, filePathCallback);
      },
      startSelection(context, filePathCallback) {
        console.log("startSelection");
        let abc = context.authorize().then(() => {
          return context.present();
        })
          .then((selection) => {
            selection.forEach((selected) => {
              let path = selected.android;
              let file = fs.File.fromPath(path);
              this.file_path = file.path;
              this.file_path = "file://" + this.file_path;
              let results = Array.create(android.net.Uri, 1);
              results[0] = android.net.Uri.parse(this.file_path);
              filePathCallback.onReceiveValue(results);
            });
          }).catch(function (e) {
            console.log(e);
          });
      }

     let TNSWebChromeClient = android.webkit.WebChromeClient.extend({
          onShowFileChooser: function (view, valueCallback, fileChooserParams) {
            console.log("onShowFileChooser");
            _this.fileCallback(valueCallback);
            return true;
          }
        });
    let thsWebChromeClient = new TNSWebChromeClient();
     webview.android.setWebChromeClient(thsWebChromeClient);
person touchmx    schedule 12.12.2019

 webViewLoaded(args: EventData): any {
        const webView: WebView = <WebView>args.object;

        if (webView.android) {


            const filechooser = 1;
            let message = null;
            let activity = application.android.context;
            const onActivityResult = (requestCode, resultCode, data) => {

            }
            // @ts-ignore
            let myChrome = android.webkit.WebChromeClient.extend({
                onShowFileChooser: (webView, filePathCallback, fileChooserParams) => {
                    openfile(webView, filePathCallback, fileChooserParams).then(value => {
                        console.log(value)
                    })
                    return true;
                }
            });
            webView.android.setWebChromeClient(new myChrome());
        }
    }


function openfile(webView, filePathCallback, fileChooserParams) {
    return new Promise(function(resolve, reject) {
        try {
            const filechooser = 1;

            let intent = fileChooserParams.createIntent();
            intent.addCategory("android.intent.category.OPENABLE");
            // @ts-ignore
            let chooser = android.content.Intent.createChooser(intent, "File Chooser")

            application.android.foregroundActivity.startActivityForResult(chooser, filechooser);

            var activity =
                application.android.foregroundActivity || application.android.startActivity;

            activity.onActivityResult = function(requestCode, resultCode, data) {
                // Check which request we're responding to
                if (requestCode === filechooser) {
                    // @ts-ignore
                    if (resultCode === android.app.Activity.RESULT_OK) {
                        if (data != null && requestCode == filechooser && filePathCallback != null) {

                            // @ts-ignore
                            let value = android.webkit.WebChromeClient.FileChooserParams.parseResult(resultCode, data);
                            filePathCallback.onReceiveValue(value);
                        }

                        return resolve({
                            response: 'success'
                        });
                        // @ts-ignore
                    } else if (resultCode === android.app.Activity.RESULT_CANCELED) {
                        return resolve({
                            response: 'cancelled'
                        });
                    } else {
                        return resolve({
                            response: 'failed'
                        });
                    }
                }
            };
        } catch (ex) {
            reject(ex.toString());
        }
    });
}

надеюсь хоть чем то поможет...))

person Николай Ямброськин    schedule 23.04.2020
comment
Привет! Хотя этот код может решить проблему, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество. вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person Brian; 23.04.2020