2017-12-16 4 views
1

WebView에서 브라우저 쿠키를 수집하여 다른 활동으로 반환해야합니다. 쿠키를 수집하는 것은 이미 작동하지만 WebViewClient을 확장하는 클래스에서 발생하며 거기에서 데이터를 반환하는 방법을 알지 못합니다.WebViewClient가 Activity onPageFinished에 데이터를 반환합니다.

2 가지 활동이 있습니다. MainActivity 및 LoginActivity와 같습니다. MainActivity에는 인 텐트를 만들고 LoginActivity를 시작하는 단일 버튼이 있습니다.이 버튼에는 단일 WebView가 있습니다. OnCreate()이면 WebView는 웹 사이트의 로그인 페이지로 연결됩니다. 사용자가이 사이트에 성공적으로 로그인하면 데이터를 브라우저 쿠키에 저장합니다. 나중에 API 호출에 필요한 데이터입니다. 이 데이터를 어떻게 MainActivity에 반환 할 수 있습니까?

WebView에는 URL이 예상 한 것일 경우 OnPageFinished() 메서드가 오버라이드 된 사용자 지정 WebViewClient가 있으며 아래와 같이 브라우저 쿠키가 수집됩니다.

class TempWebViewClient extends WebViewClient { 
    @Override 
    public void onPageFinished(WebView view, String url) { 
     // If page URL is the Home page (ie., you logged in successfully), collect cookies. 
     if (url.equals("https://slate.sheridancollege.ca/d2l/m/home")) { 
      String cookies = CookieManager.getInstance().getCookie(url); 
      String[] cookies2 = cookies.split(";"); 
      String key1 = ""; 
      String key2 = ""; 

      // Find Keys placed in browser cookies. 
      for (String c : cookies2) { 
       String[] c2 = c.split("="); 

       if (c2[0].equals(" phrase1")) { 
        key1 = c2[1]; 
       } 
       if (c2[0].equals(" phrase2")) { 
        key = c2[1]; 
       } 
      } 
     } 
    } 
} 

LoginActivity 내가 쿠키에서 열쇠를받은 때까지 finish() (MainActivity로 돌아)를 호출하지 않아야합니다. 이미 내가 가진 것을 생각하면 어떻게하면 될까요? LoginActivity가 WebView의 데이터를 가질 때까지 MainActivity로 돌아가는 것을 어떻게 억제 할 수 있는지 모르겠습니다.

public class LoginActivty extends Activity { 
    WebView webview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
     setupViews(); 
     setContentView(webview); 
    } 
    public void setupViews() { 
     StrictMode.ThreadPolicy policy = new 
     StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     CookieManager.getInstance().setAcceptCookie(true); 
     webview = new WebView(this); 
     webview.setWebViewClient(new TempWebViewClient()); 
     webview.getSettings().setJavaScriptEnabled(true); 
     webview.loadUrl("website"); 
    } 
} 
+0

쉬운 방법에 대한 LoginActivity을 기능을 시작 만들기 activity 또는 startActivity를 검색 한 다음 결과를 리턴하십시오. –

+0

문제는 타이밍입니다. 멀티 스레딩 문제처럼 보입니다. 나는 쿠키의 키가 획득되었을 때 LoginActivity가 MainActivity로만 돌아 가기를 원한다. 솔루션에서 시간을 고려하지 않습니다. – UmbraLegacy

답변

0

쿠키를 얻으면 결과를 전달하기 위해 TempWebclient에서 로그인 활동 참조를 만듭니다.

class TempWebViewClient extends WebViewClient { 

    LoginActivty mDelegate; 

    public TempWebViewClient(LoginActivty ref) { 
     this.mDelegate = ref; 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
    // perform task 
    String cookie;// get from CookieManager 
    mDelegate.sendCookieAndFinish(cookie); 
    } 

} 

주요 활동에서 로그인 활동

public class LoginActivty extends Activity { 

    WebView webview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    .... 
    } 
    public void setupViews() { 
     .... 
     // send activity reference to webclient 
     webview.setWebViewClient(new TempWebViewClient(this)); 
    } 

    public void sendCookieAndFinish(String cookie){ 
    setResult(ResultCode,ResultIntent); // set result for your main activity 
    // store cookie to storage 
    finish(); 
    } 

} 

에서 결과 일부 기본 값으로 sharedPreference에서 쿠키를 저장하고 메인에서 로그인 fininsh 후 확인할 수 있습니다

+0

당신은 아름답습니다! 이것은 완벽하게 작동합니다. – UmbraLegacy

관련 문제