Program Tip

Android Webview에서 JavaScript가 작동하지 않습니까?

programtip 2020. 12. 10. 21:00
반응형

Android Webview에서 JavaScript가 작동하지 않습니까?


나는 웹보기, 일부 버튼을 사용하고 CMS에 대한 자바 스크립트 호출에 의존하는 상대적으로 간단한 iOS 앱의 Android 버전을 만들려고합니다.

하지만 저는 개발 초기 단계에 갇혀 있습니다 : 웹뷰는 자바 스크립트에서 작동하지 않습니다. 저는 안드로이드 웹뷰에서 JS를 활성화하는 방법에 대한 많은 포스트를 읽었지만 지금까지는 운이 없습니다.

다음은 내 코드 중 일부입니다.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient());
    mWebView.setWebViewClient(new HelloWebViewClient()
    {
        @Override  
        public void onPageFinished(WebView view, String url)  
        {  
            //Calling an init method that tells the website, we're ready 
            mWebView.loadUrl("javascript:m2Init()");
            page1(mWebView);
        }  
    });
  mWebView.loadUrl("http://my_url/mobile/iphone//app.php");  
}

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public void page11(View view)
{
    mWebView.loadUrl("javascript:m2LoadPage(1)");
}

내가 여기서 뭘 잘못하고 있니? URL은 iOS 앱과 브라우저에서 완벽하게 작동합니다. 하지만 내 앱에는 없습니다!

뻔한 일이라고 말해주세요 ...


결정된! 오류에 박차를 가하여 설정해야한다는 것을 알았습니다.

setDomStorageEnabled(true)

webview 설정.

도움을 주셔서 감사합니다 Stephan :)


Android에서 WebView가 작동하지 않는 경우 항상 다음과 같은 미친 플래그를 설정했는지 확인합니다.

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setDisplayZoomControls(false);
    webSettings.setSupportZoom(true);
    webSettings.setDefaultTextEncodingName("utf-8");

왜 이것이 기본으로 설정되지 않았는지 궁금합니다. 요즘 자바 스크립트 콘텐츠가없는 웹 페이지를 기대하는 사람은 누구이며, 명시하지 않는 한 DOM을 사용할 수 없을 때 자바 스크립트를 사용하는 용도는 무엇인지 궁금합니다. 누군가가 이것을 버그 또는 개선 / 기능 요청으로 이미 제출하고 원숭이가 작업 중이기를 바랍니다.

그리고 다음과 같이 어딘가에 더 이상 사용되지 않는 물건이 있습니다.

webView.getSettings().setPluginState(PluginState.ON);

이 모든 것은 앱 내에서 웹 페이지를로드하기위한 것입니다.

iOS에서는 매우 간단합니다-Swift 3.0

private func openURLWithInAppBrowser(urlString:String) {
    guard let url = URL(string:urlString) else {
        return
    }
    let sfSafari = SFSafariViewController(url:url)
    present(sfSafari, animated: true, completion: nil)
}

WebView에서 자바 스크립트로드

webView.getSettings().setDomStorageEnabled(true);

매니페스트에서 올바른 인터넷 권한을 활성화 했습니까? 그렇지 않으면 모든 것이 잘 보입니다. 혹시 실제 Android 휴대 전화에서도이 코드를 테스트 했나요? 에뮬레이터뿐만 아니라?

다음은 약간 다른 접근 방식에 대한 좋은 자습서 입니다. 그것이 당신을 위해 작동하는지 확인하기 위해 그것을 시도해 볼 수 있습니다.


이 비디오 ( http://youtu.be/uVqp1zcMfbE )는 작동하도록 힌트를주었습니다. 열쇠는 Android 폴더 htmljs파일 을 저장하는 것 assets/입니다. 그런 다음 다음을 통해 쉽게 액세스 할 수 있습니다.

webView.loadUrl("file:///android_assets/your_page.html");

MainActivity.java에 다음 코드 줄을 추가합니다.

js를 활성화하는 데 도움이되었습니다.

  webSetting.setJavaScriptEnabled(true);
  webView.setWebChromeClient(new WebChromeClient());
  webView.setWebViewClient(new WebViewClient());

AndroidManifest 파일에서이 권한을 잊지 마십시오.

<uses-permission Android:name="Android.permission.INTERNET" />

WebView 가 JS를 실행 하도록 허용하십시오 . 다음과 같이 간단합니다.

WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);

WebView에서 자바 스크립트 팝업을 활성화하려면 webChromeClient 를 설정 하고 openFileChooser 메서드를 재정의해야 합니다.

    mWebview.setWebChromeClient(new WebChromeClient(){
        // For Android 4.1+
        @SuppressWarnings("unused")
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            mUploadMessage = uploadMsg;

            Intent i = new Intent(Intent.ACTION_GET_CONTENT);

            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType(acceptType);

            startActivityForResult(Intent.createChooser(i, "SELECT"), 100);
        }

        // For Android 5.0+
        @SuppressLint("NewApi")
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            if (mUploadMessageArr != null) {
                mUploadMessageArr.onReceiveValue(null);
                mUploadMessageArr = null;
            }

            mUploadMessageArr = filePathCallback;

            Intent intent = fileChooserParams.createIntent();

            try {
                startActivityForResult(intent, 101);
            } catch (ActivityNotFoundException e) {
                mUploadMessageArr = null;

                Toast.makeText(activity,"Some error occurred.", Toast.LENGTH_LONG).show();

                return false;
            }

            return true;
        }
    });

그리고 아래와 같이 onActivityResult를 처리합니다.

@SuppressLint("NewApi")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 100) {
        if (mUploadMessage == null) return;
        Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
    }

    else if (requestCode == 101) {
        if (mUploadMessageArr == null) return;
        mUploadMessageArr.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
        mUploadMessageArr = null;
    }

}

당신이있는 경우 코 틀린 당신은 자바 스크립트 작업을 진행하기 위해이 방법을 사용할 수 있습니다 :

webView.apply {
     loadUrl(
         "file:///android_asset/frm/my_html_landing_page_here.html"
     )

     settings.javaScriptEnabled = true
     settings.domStorageEnabled = true
 }

Also make sure that your entire folder is inside the Assets folder (this includes html, javascript and other file needed)

Cheers.


If nothing above helped try to add delay in WebViewClient.onPageFinished listener

override fun onPageFinished(view: WebView?, url: String?) {
            Handler().postDelayed({
                //update your view with js here
                super.onPageFinished(view, url)
            }, 1000)
        }

참고URL : https://stackoverflow.com/questions/7548172/javascript-not-working-in-android-webview

반응형