# WebView Example

```
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```

```
package com.wallet.testwebview;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

public class WebViewActivity extends AppCompatActivity {

    private static final String TAG = "WebViewActivity";
    private WebView webView;
    private ProgressBar progressBar;


    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        if (Constant.second != null && !Constant.second.isFinishing()) {
            Constant.second.finish();
        }
        progressBar = (ProgressBar) findViewById(R.id.progressbar);
        webView = (WebView) findViewById(R.id.webview);
        webView.setBackgroundColor(0); 
        Intent intent = getIntent();
        String url = intent.getStringExtra("url");
//        url = "http://demo.gemini-tiger.cn/order";
        webView.loadUrl(url);
        //添加js监听 这样html就能调用客户端
        webView.addJavascriptInterface(this, "PWA");

        webView.setWebChromeClient(webChromeClient);
        webView.setWebViewClient(webViewClient);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebContentsDebuggingEnabled(true);
        webSettings.setSupportMultipleWindows(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹出窗口
        webSettings.setSupportMultipleWindows(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setBlockNetworkLoads(false); // 是否从网络获取资源

        /**
         * LOAD_CACHE_ONLY: 不使用网络，只读取本地缓存数据
         * LOAD_DEFAULT: （默认）根据cache-control决定是否从网络上取数据。
         * LOAD_NO_CACHE: 不使用缓存，只从网络获取数据.
         * LOAD_CACHE_ELSE_NETWORK，只要本地有，无论是否过期，或者no-cache，都使用缓存中的数据。
         */
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        //支持屏幕缩放
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        //不显示webview缩放按钮
        webSettings.setDisplayZoomControls(false);
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
        findViewById(R.id.bt_sx).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                webView.reload();
            }
        });
    }

    //WebViewClient主要帮助WebView处理各种通知、请求事件
    private WebViewClient webViewClient = new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {//页面加载完成
            Log.i(TAG, "加载完成url:" + url);
            progressBar.setVisibility(View.GONE);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面开始加载
            Log.i(TAG, "加载url:" + url);
            progressBar.setVisibility(View.VISIBLE);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.i(TAG, "拦截url:" + url);
            return super.shouldOverrideUrlLoading(view, url);
        }


    };

    private static ValueCallback<Uri[]> filePathCallback1;

//WebChromeClient support WebView to process Javascript dialog, web icon, web title, loading progress, etc
private WebChromeClient webChromeClient = new WebChromeClient() {

//Don't support js alert pop-up. Need to montior and pop-up through dialog.
@Override
public boolean onJsAlert(WebView webView, String url, String message, JsResult result) {
    AlertDialog.Builder localBuilder = new AlertDialog.Builder(webView.getContext());
    localBuilder.setMessage(message).setPositiveButton("Yes", null);
    localBuilder.setCancelable(false);
    localBuilder.create().show();
    //Note:
    //Must use this code: result.confirm():
    //The result is "Yes" status and wakeup WebCore thread at the same time
    //Cannot click the confirm button if not
    result.confirm();
    return true;
}

//Get web title
@Override
public void onReceivedTitle(WebView view, String title) {
    super.onReceivedTitle(view, title);
    Log.i(TAG, "web title:" + title);
}

//callback of loading progress
@Override
public void onProgressChanged(WebView view, int newProgress) {
    progressBar.setProgress(newProgress);
}


@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
//return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);

    filePathCallback1 = filePathCallback;
    //Convert the format type received by the front-end H5 into a string without a semicolon after it
    String[] acceptTypes = fileChooserParams.getAcceptTypes();
    String acceptType = "*/*";
    StringBuilder sb = new StringBuilder();
    if (acceptTypes.length > 0) {
        for (String type : acceptTypes) {
            sb.append(type).append(';');
        }
    }
    if (sb.length() > 0) {
        String typeStr = sb.toString();
        acceptType = typeStr.substring(0, typeStr.length() - 1);
    }
    //According to the judgment, trigger related operations, such as file selection, taking pictures, etc. For details, please refer to the step-3
    //Here, you can also pop up a dialog box for the user to choose. Remember to call the callback onReceiveValue method after the dialog box pops up, otherwise there will be a bug that the dialog box cannot be popped up next time.
    Intent intent = new Intent(Intent.ACTION_PICK, null);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, acceptType);
    WebViewActivity.this.startActivityForResult(intent, 15);

    return true;
}

};

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

    if (requestCode == 15) {
        if (resultCode == Activity.RESULT_OK) {
            Uri imgUri = data.getData();
            Uri[] result = new Uri[]{imgUri};
            filePathCallback1.onReceiveValue(result);
        } else {
            filePathCallback1.onReceiveValue(new Uri[]{});
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

    @JavascriptInterface
    public void bindSuc(String str) {
        Log.i(TAG, "bindSuc: str = " + str);
        
        finish();
    }

    private void showToast(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }
}

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.pagsmile.com/payout/submit-a-payout/pagsmile-wallet/webview-example.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
