2016-09-14 6 views
1

Я использую android WebView для загрузки страницы входа Instagram. Он загружается отлично, и я вижу его на экране. После этого я нажимаю кнопку «Войти через Facebook», которая перенаправляет меня на страницу входа в Facebook. Я ввожу свои учетные данные в Facebook и нажимаю кнопку входа в систему. После этого Facebook перенаправляет меня обратно в Instagram для перенаправления URI (который равен https://www.instagram.com/accounts/signup), и эта страница загружается бесконечно (если я выполняю те же операции в браузере, Facebook перенаправляет меня на ту же страницу, но эта страница не загружается бесконечно, но перенаправляет меня на мою страницу профиля учетной записи Instagram). Что я могу сделать, чтобы предотвратить бесконечную загрузку? Вот мой код Activity с WebView и скриншот экрана с этой страницейAndroid-страница instagram в webview бесконечно загружается

public class InstagramAuthActivity extends BaseActivity implements InstagramRepository.OnLoadListener<String> { 

    public static final String EXTRA_COOKIES = "cookies_instagram"; 
    public static final String EXTRA_USERNAME = "username_instagram"; 

    private static final String URL = "https://www.instagram.com"; 

    private ViewHolder mViewHolder; 
    private String mCookies; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_instagram_auth); 
     createViewHolder(); 
     populateViewHolder(); 
    } 

    private void createViewHolder() { 
     mViewHolder = new ViewHolder(); 
     mViewHolder.mAuthWebView = (WebView) findViewById(R.id.auth); 
    } 

    private void populateViewHolder() { 
     WebSettings settings = mViewHolder.mAuthWebView.getSettings(); 
     settings.setJavaScriptEnabled(true); 
     mViewHolder.mAuthWebView.setWebViewClient(new InstagramWebViewClient()); 
     mViewHolder.mAuthWebView.loadUrl(URL); 
    } 

    @Override 
    public void onLoad(String data) { 
     if (data != null) { 
      Intent intent = new Intent(); 
      intent.putExtra(EXTRA_COOKIES, mCookies); 
      intent.putExtra(EXTRA_USERNAME, data); 
      setResult(RESULT_OK, intent); 
     } else { 
      setResult(RESULT_CANCELED); 
     } 
     finish(); 
    } 

    @Override 
    public void onFail() { 
     setResult(RESULT_CANCELED); 
     finish(); 
    } 

    private class ViewHolder { 
     WebView mAuthWebView; 
    } 

    private class InstagramWebViewClient extends WebViewClient { 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      String cookies = CookieManager.getInstance().getCookie(url); 
      Log.d("tag", "url: " + url + "; cookies: " + cookies); 
      if (cookies.contains("ds_user_id")) { 
       mCookies = cookies; 
       String[] cookieData = cookies.split("; "); 
       if (cookieData != null && cookieData.length > 1) { 
        String[] idData = null; 
        for (String cookie : cookieData) { 
         if (cookie.contains("ds_user_id")) { 
          idData = cookie.split("="); 
          break; 
         } 
        } 
        if (idData != null && idData.length > 1) { 
         InstagramRepository.getInstance(InstagramAuthActivity.this).getUsername(idData[1], InstagramAuthActivity.this); 
        } 
       } 
      } 
     } 

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

     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
      super.onReceivedError(view, request, error); 
     } 
    } 
} 

Здесь также регистрирует все URL, к которому я перенаправлен

09-14 10:53:14.555 21316-21316/ru.luckybook D/tag: url: https://www.instagram.com/ 
09-14 10:53:15.539 21316-21316/ru.luckybook D/tag: url: https://www.instagram.com/ 
09-14 10:53:22.048 21316-21316/ru.luckybook D/tag: url: https://m.facebook.com/login.php?skip_api_login=1&api_key=124024574287414&signed_next=1&next=https%3A%2F%2Fm.facebook.com%2Fv1.0%2Fdialog%2Foauth%3Fredirect_uri%3Dhttps%253A%252F%252Fwww.instagram.com%252Faccounts%252Fsignup%252F%26scope%3Demail%26response_type%3Dtoken%252Cgranted_scopes%26client_id%3D124024574287414%26ret%3Dlogin%26logger_id%3D7b5f7abf-6769-464a-86e9-a26e8301375d&cancel_url=https%3A%2F%2Fwww.instagram.com%2Faccounts%2Fsignup%2F%3Ferror%3Daccess_denied%26error_code%3D200%26error_description%3DPermissions%2Berror%26error_reason%3Duser_denied%23_%3D_&display=touch&locale=ru_RU&logger_id=7b5f7abf-6769-464a-86e9-a26e8301375d&_rdr 
09-14 10:53:46.864 21316-21316/ru.luckybook D/tag: url: https://www.instagram.com/accounts/signup/ 

This page loads infinitely

+0

переопределить метод 'onPageFinished' и проверить, вызвано это или нет. –

+0

Я сделал это. onPageFinished и я напечатал url в журналах. Это https://www.instagram.com/accounts/signup То же, что и в браузере. Но в браузере я перенаправлен с этой страницы на страницу профиля, но в WebView эта страница ничего не делает. Он просто показывает индикатор выполнения. –

+0

Я думаю, что есть некоторые проблемы с вашим URL. Для меня он перенаправляется на вход в facebook. Поместите журналы в метод ошибок и проверьте там. –

ответ

1

При создании WebView, вам просто нужно включить сторонние файлы cookie в WebView следующим образом:

CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView,true); 

После этого Instagram начнет нормально работать в вашем WebView. У меня была такая же проблема, и я решил ее, выполнив вышеупомянутый код.

Смежные вопросы