2017-12-13 11 views
0
Code for loading WebView. Screen appear white when loading on KitKat device.I used WebChromeClient in which override onProgressChanged() method.I used the following code.It works well on other devices greater than KitKat. Is there any solution for that.I read android developers doc but didn't get.Thanks.This is url private String url="https://xxxx.com/"; 



private void initWebview() 
    { 
     //Timer myTimer = new Timer(); 
     //Start this timer when you create you task 
     //myTimer.schedule(new loaderTask(), 3000,1); // 3000 is delay in millies 

     //webView.setWebChromeClient(new MyWebChromeClient(this)); 

      webView.setWebChromeClient(new MyWebChromeClient(this) { 

       @Override 
       public void onPermissionRequest(final PermissionRequest request) { 
       //super.onPermissionRequest(request); 
       runOnUiThread(new Runnable() { 
       @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
       @Override 
       public void run() { 
       if (request.getOrigin().toString().equals(url)) 
       { 
        request.grant(request.getResources()); 
        }else 
       { 
        request.deny(); 
       } 
       } 
       }); 
      } 
      } 
     ); 

      webView.setWebViewClient(new WebViewClient() 
      { 
       @Override 
       public void onPageStarted(WebView view, String url, Bitmap favicon) { 
        super.onPageStarted(view, url, favicon); 
        progressBar.setVisibility(View.VISIBLE); 
       } 

       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
       } 

       @Override 
       public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
        super.onReceivedSslError(view, handler, error); 
        handler.proceed(); 
       } 

       @Override 
       public void onReceivedError(WebView view, int errorCode, 
              String description, String failingUrl) { 

        Log.i(TAG, "GOT Page error : code : " + errorCode + " Desc : " + description); 
        showError(OpenWebAppActivity.this, errorCode); 
        //TODO We can show customized HTML page when page not found/ or server not found error. 
        super.onReceivedError(view, errorCode, description, failingUrl); 
       } 


       @Override 
       public void onPageFinished(WebView view, String url) { 
        super.onPageFinished(view, url); 
        isPageLoadedComplete = true; 
        timeout=false; 
        progressBar.setVisibility(View.GONE); 
       } 
      }); 
    } 

개인 클래스 MyWebChromeClient이 WebChromeClient { 컨텍스트 컨텍스트 확장합니다.;아이콘 (eg.Menu 아이콘)

public MyWebChromeClient(Context context) { 
     this.context = context; 
     timeout=true; 
    } 

    @Override 
    public void onReceivedTitle(WebView view, String title) { 
     super.onReceivedTitle(view, title); 
     getWindow().setTitle(title); 
    } 

    @Override 
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
     AlertDialog dialog = new AlertDialog.Builder(view.getContext()). 
       setMessage(message). 
       setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         //do nothing 
        } 
       }).create(); 
     dialog.show(); 
     result.confirm(); 
     return true; 
    } 

WebView로드 코드. 화면 KitKat 장치에로드 할 때 흰색 나타납니다. 나는 onProgressChanged() 메서드를 재정의하는 WebChromeClient를 사용합니다. 다음 코드를 사용합니다. 그것은 KitKat보다 큰 다른 장치에서 잘 작동합니다. 그것에 대한 해결책이 있습니까? 나는 안드로이드 개발자 문서를 읽었지만 얻지 못했습니다. 고맙습니다. 첫째

+0

당신은 어떤 노력을 보여줄 필요가있다. 실패한 현재 코드를 보여주고, 시도한 것을 설명하고, 멈추는 위치를 정확히 설명하십시오. 귀하가 작성한 것을 읽음으로써 우리는 어떤 언어를 코딩하고 있는지 알지 못합니다 ... –

+0

어떤 해결책을 바랍니다 –

+0

webChromeClient를 사용하지만 WebView가 아닌 ​​Chrome 창에서 열 수 있습니다. 장치가 if-else 조건을 사용했습니다. 적은 킷캣은 다음 WebChromeClient –

답변

0

The Actual footage taken from the emulator under KitKat

:

사용의 방식에 관한 WebViewClient와 WebChromeClient 사이에 큰 차이가 있습니다. 공식 문서에서 인용 :

WebViewClient

/** * 다양한 알림 및 * 요청을받을 WebViewClient를 설정합니다. 이것은 현재 핸들러를 대체 할 것입니다. * 파라미터 : 클라이언트는 WebViewClient * @see #getWebViewClient */

WebChromeClient

/** *의 구현은 크롬 핸들러를 설정합니다. 이것은 * 용 WebChromeClient * 구현으로 JavaScript 대화 상자, favicons, 제목 및 진행 상황을 처리하는 데 사용됩니다. * 현재 처리기를 대체합니다. * 파라미터 : 클라이언트 WebChromeClient 의 구현 * @see #getWebChromeClient */

문제는 단지 Kitkat으로하고 웹 페이지의 로딩한다면 그대로, 당신이 사용할 필요가 없습니다 WebChromeClient!

그래서 상당히 그 사이에 내가 보호 라우터 뒤에 나는대로 나에게 오류를 제공했기 때문에 웹 페이지 xxxx

을 테스트 할 수있는, 기본 문제가 될 수 있지만, 이미지가 이미로드와 나는 구글을 테스트했습니다 그것은 제대로 작동했고 실제로 KitKat 에뮬레이터에서 찍은 이미지에서 볼 수 있으며 잘 작동합니다.

기본적으로 코드를 조금만 조정 했으므로 여기에 사용할 최종 코드가 있습니다.

GeneralWebViewClient

public class GeneralWebViewClient extends WebViewClient { 

    private WebViewListener onWebViewListener; 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     super.onPageStarted(view, url, favicon); 
     if (onWebViewListener != null) { 
      onWebViewListener.onPageStarted(view, url, favicon); 
     } 
    } 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 

    /** 
    * Important to notice! This method must be used on in Lollipop and above versions because the old one is deprecated so we annotate it, but we have to use the old one for Pre-Lollipop devices 
    * @param view 
    * @param request 
    * @return 
    */ 
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
     view.loadUrl(request.getUrl().toString()); 
     return super.shouldOverrideUrlLoading(view, request); 
    } 

    @Override 
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
     super.onReceivedSslError(view, handler, error); 
     handler.proceed(); 
    } 

    @Override 
    public void onReceivedError(WebView view, int errorCode, 
           String description, String failingUrl) { 

     if (onWebViewListener != null) { 
      onWebViewListener.onPageLoadingError(description, errorCode, false, null); 
     } 
     super.onReceivedError(view, errorCode, description, failingUrl); 
    } 


    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     if (onWebViewListener != null) { 
      onWebViewListener.onPageFinished(view, url); 
     } 
    } 


    /** 
    * Simple setter for the listener 
    * 
    * @param onWebViewListener 
    */ 
    public void setOnWebViewListener(@Nullable WebViewListener onWebViewListener) { 
     this.onWebViewListener = onWebViewListener; 
    } 


    /** 
    * Add all needed logic to this method to release your used resources when the caller gets destroyed 
    */ 
    private void releaseResources() { 
     onWebViewListener = null; 
    } 


    /** 
    * A class which handles a lifecycle events if attached. It is always a good idea to release resources when the caller gets destroyed, so this is a small tune up for that. 
    */ 
    public class LifeCycleObserver implements LifecycleObserver { 
     @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 
     private void clean() { 
      releaseResources(); 
     } 
    } 

    /** 
    * So to make the code less in our main place, we just create a set of needed callbacks to pass to the caller and just ignore the rest to keep main place clean and tidy 
    * Important to notice the code {@code onPageLoadingError} which takes boolean argument {code sslError} ,hence indicating whether it was an error from Sssl or no, and accordingly 
    * {@code {@link SslErrorHandler}} can be null. 
    */ 
    public interface WebViewListener { 
     void onPageStarted(WebView view, String url, Bitmap favIcon); 

     void onPageFinished(WebView view, String url); 

     void onPageLoadingError(String error, int errorCode, boolean sslError, @Nullable SslErrorHandler handler); 
    } 
} 

정말의 필요성을하지 않는

public class MainActivity extends AppCompatActivity implements GeneralWebViewClient.WebViewListener { 

    private static final String TAG = "tag"; 
    private WebView webView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     webView = findViewById(R.id.webView); 

     GeneralWebViewClient generalWebViewClient = new GeneralWebViewClient(); 
     generalWebViewClient.setOnWebViewListener(this); 

     GeneralWebViewClient.LifeCycleObserver lifeCycleObserver = generalWebViewClient.new LifeCycleObserver(); 
     getLifecycle().addObserver(lifeCycleObserver); 

     webView.setWebViewClient(generalWebViewClient); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.loadUrl("http://www.google.com"); 
    } 


    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favIcon) { 
     progressBar.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     isPageLoadedComplete = true; 
     timeout = false; 
     progressBar.setVisibility(View.GONE); 
    } 

    @Override 
    public void onPageLoadingError(String error, int errorCode, boolean sslError, @Nullable SslErrorHandler handler) { 
     if (sslError) { 
      handler.proceed(); 
     } else { 
      Log.i(TAG, "GOT Page error : code : " + errorCode + " Desc : " + error); 
      showError(OpenWebAppActivity.this, errorCode); 
     } 

    } 

} 

을 (당신이 웹보기의로드를 처리 할 MainActivity 또는 활동)을 GeneralWebViewClient 클래스의 구현 Chrome 클라이언트 사용. 필요하다면 어떤 경우에? 아, 그리고 단지 안전 목적을 위해 :

인터넷 권한을 추가하는 것을 잊지 마세요 - <uses-permission android:name="android.permission.INTERNET"></uses-permission>

+0

덕분 확인 그렇게하려면 –

+0

내 기쁨 시도 대답을 –

+0

코드가 제대로 작동하지만 app.which minSdkVersion에 일부 HTML 페이지 정렬 문제가 있습니다. 아무런 문제가 없도록 설정합니다. –