0

I'm developing an app with a webview. I have a fileupload element and my app enables choosing "camera" or "gallery" by displaying an AlertDialog in the "openfilechooser" method. Here is what i'm doing:

-I tap on the fileupload element
-An AlertDialog pops up to read my choice of "camera" or "gallery"
-I change my mind and give up choosing a file and click "Android Back Button"

When i click the back button, all javascript stops and my page stops responding.

Is there a reason for javascript to stop? Thanks in advance

Emre Çınar
  • 30
  • 2
  • 9

2 Answers2

0

If you want to use back button on web view, you must declare before intent to web view. You must to implement method onBackPrasses, or onKeyPressed and get the KEY value. You can find answer on this link Enable back button in WebView

Also for enabling javascript

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
Community
  • 1
  • 1
IMujagic
  • 1,229
  • 10
  • 22
0

I tried several tricks and finally found the solution.

FileUpload element needs a "ValueCallback" after all these method calls.So "onActivityResult" has to return a result to the fileupload element. But the "onActivityResult" method can not be called when user cancels the alert dialog. This causes fileupload element to generate error.

I added "setOnCancelListener" to my alert dialog like this:

.setOnCancelListener(new DialogInterface.OnCancelListener() {

    @Override
    public void onCancel(DialogInterface dialog) {
     mUploadMessage.onReceiveValue(null);
     mUploadMessage = null;
    }
})

You have to return at least "null" to the file upload element in order to keep operating . Otherwise fileupload stalls and this causes all javascript to stall.

I also catched another case that makes fileupload stall:
- User taps on the fileupload element
- Chooses a choice (Cam or Galller doesn't matter)
- Cam or Gallery shows up and user presses the "Back Button"

This returns a RESULT_CANCELED code to the "onActivityResult" method and you have to handle it like this:

@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    try {
        super.onActivityResult(requestCode, resultCode, intent);

        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK
                && intent != null)
            mUploadMessage.onReceiveValue(intent.getData());
        else
            mUploadMessage.onReceiveValue(null);
    } catch (Exception e) {
        Log.e("Error", e.getLocalizedMessage());
        mUploadMessage.onReceiveValue(null);
    } finally {
        mUploadMessage = null;
    }
}

mUploadMessage is defined like this:

    private ValueCallback<Uri> mUploadMessage;
Emre Çınar
  • 30
  • 2
  • 9