2013-08-22 3 views
1

У меня есть приложение, в котором я вхожу в систему, используя мое имя пользователя и пароль, а затем переключаюсь на страницу, содержащую веб-просмотр. Веб-просмотр распознает это имя пользователя и пароль и загружает контент (через sharedpreferences), но проблема в том, что он загружается ТОЛЬКО ОДИН РАЗ, и когда я перехожу к какой-либо другой части своего приложения и возвращаюсь, он показывает пустой экран, который в конечном итоге загружает страницу с ошибкой быть перемещенными в веб-просмотре. Есть в любом случае, чтобы исправить это, чтобы сохранить WebView распознать имя пользователя и передать каждый раз у перейти на страницу и загрузите content.Here в код для того же: страница, содержащая WebView:Как исправить аутентификацию пароля/имени пользователя в моем коде?

public class AnswersFragmentWebView extends Fragment implements MainActivity.BackPressListener<Fragment> { 

    private static final String SYMBOL = "symbol"; 
    private static final String SYMBOL_TYPE = "symbol_type"; 
    public static final String CONTAINER_ID = "container_id"; 
    public static final String TAG_QUOTES_FRAGMENT_WEBVIEW = "AnswersFragmentWebView"; 
    public static void removeInstance(final FragmentManager manager) { 
     final AnswersFragmentWebView fragment = (AnswersFragmentWebView) manager.findFragmentByTag(TAG_QUOTES_FRAGMENT_WEBVIEW); 
     if (fragment == null) { 
      return; 
     } 

     final FragmentStackManager stackManager = FragmentStackManager.getInstance(); 
     if (stackManager.getTopFragment() instanceof AnswersFragmentWebView) { 
      stackManager.popTopFragment(); 
     } 
    } 

    private boolean goingBack = false; 
    private boolean onBackPressClearStack = true; 
    private WebView webView; 
    private final static String URL = "https://amers1.mobile13.cp.justice.com/msf1.0/fwd/answers/answers/service/v1/?q=ibm%20revenue&ui.theme=dark&uuid=PADACT-002&userAgent=iphone"; 
    //private final static String URL = "https://www.google.com"; 
    SharedPreferencesManager manager = SharedPreferencesManager.getInstance(); 
    private final String USERNAME =manager.getLoginUsername(); 
    private final String PASSWORD = manager.getDecryptedLoginPassword(); 
    private final static String HOST = "https://amers1.mobile13.cp.justice.com/msf1.0/fwd/answers/answers/service/v1/?q=ibm%20revenue&ui.theme=novadark&uuid=PADACT-002&userAgent=iphone"; 
    private final static String REALM = "Users Only"; 

    public void setOnBackPressClearStack(boolean b){ 
     onBackPressClearStack = b; 
    } 
    public boolean webViewSteppedBack() { 
     if (webView != null && webView.canGoBack()) { 
      webView.goBack(); 

      return true; 
     } 
     return false; 
    } 

    @Override 
    public boolean backPressed(final MainActivity mainActivity) { 
     if (webViewSteppedBack()) { 
      return true; 
     } 

     if (onBackPressClearStack) { 
      goingBack = true; 
      FragmentUtils.onBackPressedKnockFragsOffStack(mainActivity, this); 
     } 
     return false; 
    } 

    private static AnswersFragmentWebView __newInstance(final AnswersFragmentWebView fragment, final FragmentManager manager, 
      final String searchAutoSuggestSymbol, final String symbolType, int containerViewId, final int inAnimation, final int outAnimation, final int popInAnimation, final int popOutAnimation) { 
     final Bundle bundle = new Bundle(); 
     bundle.putString(AnswersFragmentWebView.SYMBOL, searchAutoSuggestSymbol); 
     bundle.putString(AnswersFragmentWebView.SYMBOL_TYPE, symbolType); 
     bundle.putInt(AnswersFragmentWebView.CONTAINER_ID, containerViewId); 
     fragment.setArguments(bundle); 

     FragmentInfo fragmentInfo = new FragmentInfo(TransactionMethods.ADD, containerViewId); 
     fragmentInfo.setAnimation(inAnimation, outAnimation); 
     fragmentInfo.setPopAnimation(popInAnimation, popOutAnimation); 
     fragmentInfo.setFragmentTag(TAG_QUOTES_FRAGMENT_WEBVIEW); 
     fragmentInfo.setActionBarTitle(Application.getAppResources().getString(R.string.nav_option_quotes)); 
     FragmentStackManager.getInstance().transitionFragment(manager, fragment, fragmentInfo); 

     return fragment; 
    } 

    private static AnswersFragmentWebView __newInstance(final AnswersFragmentWebView fragment, final FragmentManager manager, 
      final String searchAutoSuggestSymbol, final String symbolType, int containerViewId) { 
     return __newInstance(fragment, manager, searchAutoSuggestSymbol, symbolType, containerViewId, R.anim.slide_in_from_right, R.anim.slide_out_to_left, R.anim.slide_in_from_left, R.anim.slide_out_to_right); 
    } 


    private static void clearWebView(final FragmentManager manager) { 
     final AnswersFragmentWebView fragment = (AnswersFragmentWebView) manager.findFragmentByTag(TAG_QUOTES_FRAGMENT_WEBVIEW); 
     if (fragment != null && fragment instanceof AnswersFragmentWebView) { 
      ((AnswersFragmentWebView)fragment).clearWebView(); 
     } 
    } 

    public static AnswersFragmentWebView newInstance(final FragmentManager manager, final String searchAutoSuggestSymbol, String symbolType) { 
     clearWebView(manager); 
     return __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, R.id.fragment_container); 
    } 

    public static AnswersFragmentWebView newInstance(final FragmentManager manager, final String searchAutoSuggestSymbol, String symbolType, int containerViewId) { 
     clearWebView(manager); 
     return __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, containerViewId); 
    } 

    public static AnswersFragmentWebView newInstanceNoBackPressed(final FragmentManager manager, final String searchAutoSuggestSymbol, final String symbolType, int containerViewId) { 
     AnswersFragmentWebView fragment = __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, containerViewId); 
     fragment.setOnBackPressClearStack(false); 
     return fragment; 
    } 

    public static AnswersFragmentWebView newInstanceNoBackPressed(final AnswersFragmentWebView fragment, final FragmentManager manager, final String searchAutoSuggestSymbol, final String symbolType, int containerViewId) { 
     fragment.setOnBackPressClearStack(false); 
     return __newInstance(fragment, manager, searchAutoSuggestSymbol, symbolType, containerViewId); 
    } 

    public static AnswersFragmentWebView newInstanceForSearch(final FragmentManager manager, final String searchAutoSuggestSymbol, String symbolType) { 
     AnswersFragmentWebView fragment = __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, R.id.fragment_container, R.anim.no_animation, R.anim.slide_out_to_right, R.anim.slide_in_from_right, R.anim.slide_out_to_right); 
     return fragment; 
    } 

    public void clearWebView() { 
     if (webView != null) { 
      webView.removeAllViews(); 
      webView.destroy(); 
      webView = null; 
     } 
    } 



    @SuppressWarnings("deprecation") 
    @SuppressLint("NewApi") 
    @Override 
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (goingBack) { 
      return null; 
     } 
     final MainActivity activity = (MainActivity) getActivity(); 

     activity.setBackPressListener(this); 


     final View view = inflater.inflate(R.layout.fragment_search_answers, container, false); 

     if (!NetworkUtils.isOnline()) { 
      LayoutUtils.showNoResult(view, R.id.quotes_webview_container); 
      return view; 

     } 

     // setup webview 
     webView = (WebView) view.findViewById(R.id.webview); 


     webView.setVisibility(View.VISIBLE); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.setWebChromeClient(new WebChromeClient()); 
     webView.setBackgroundColor(0); 
     webView.requestFocus(); 
     webView.reload(); 
     webView.getSettings().setSavePassword(true); 
     webView.getSettings().setSaveFormData(true); 
     webView.getSettings().getSaveFormData(); 
     webView.getSettings().getSavePassword(); 
     //WebViewDatabase.getInstance(getActivity()).clearHttpAuthUsernamePassword(); 
     WebViewDatabase.getInstance(getActivity()).hasHttpAuthUsernamePassword(); 
     webView.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD); 
     webView.setWebViewClient(new AnswersWebView(this,webView)); 
     webView.loadUrl(URL); 



     return view; 
    } 

    @Override 
    public void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getArguments().getString(AnswersFragmentWebView.SYMBOL); 
    } 


} 

WebView клиент:

public class AnswersWebView extends WebViewClient { 

    private String loginCookie; 
    private Context mContext; 
    private WebView mWebView; 

    public AnswersWebView(AnswersFragmentWebView answersFragmentWebView, WebView webview) { 
     super(); 

     //mContext = answersFragmentWebView; 
     mWebView = webview; 
    } 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setCookie(url, loginCookie); 
    } 

    @Override 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     Toast.makeText(view.getContext(), "ÉyÅ[ÉWì«Ç›çûÇ›ÉGÉâÅ[", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onLoadResource(WebView view, String url){ 
     CookieManager cookieManager = CookieManager.getInstance(); 
     loginCookie = cookieManager.getCookie(url); 
    } 

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

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

    @Override 
    public void onReceivedHttpAuthRequest(WebView view, final HttpAuthHandler handler, final String host, final String realm){ 
     SharedPreferencesManager manager = SharedPreferencesManager.getInstance(); 
     String userName = manager.getLoginUsername(); 
     String userPass = manager.getDecryptedLoginPassword(); 

     if (handler.useHttpAuthUsernamePassword() && view != null) { 
      String[] haup = view.getHttpAuthUsernamePassword(host, realm); 
      if (haup != null && haup.length == 2) { 
       userName = haup[0]; 
       userPass = haup[1]; 
      } 
     } 

     if (userName != null && userPass != null) { 
      handler.proceed(userName, userPass); 
     } 
     else { 
      showHttpAuthDialog(handler, host, realm, null, null, null); 
     } 
    } 

    private void showHttpAuthDialog(final HttpAuthHandler handler, final String host, final String realm, final String title, final String name, final String password) { 
     LinearLayout llayout = new LinearLayout((Activity)mContext); 
     final TextView textview1 = new TextView((Activity)mContext); 
     final EditText edittext1 = new EditText((Activity)mContext); 
     final TextView textview2 = new TextView((Activity)mContext); 
     final EditText edittext2 = new EditText((Activity)mContext); 
     llayout.setOrientation(LinearLayout.VERTICAL); 
     textview1.setText("username:"); 
     textview2.setText("password:"); 
     llayout.addView(textview1); 
     llayout.addView(edittext1); 
     llayout.addView(textview2); 
     llayout.addView(edittext2); 

     final Builder mHttpAuthDialog = new AlertDialog.Builder((Activity)mContext); 
     mHttpAuthDialog.setTitle("Basic Authentication") 
     .setView(llayout) 
     .setCancelable(false) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       EditText etUserName = edittext1; 
       String userName = etUserName.getText().toString(); 
       EditText etUserPass = edittext2; 
       String userPass = etUserPass.getText().toString(); 

       mWebView.setHttpAuthUsernamePassword(host, realm, name, password); 

       handler.proceed(userName, userPass); 
      } 
     }) 
     .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       handler.cancel(); 
      } 
     }) 
     .create().show(); 
    } 

} 

Спасибо! Justin

+0

Кажется, что есть два разных раза в коде, когда вы выполняете HTTP-аутентификацию. Когда веб-просмотр настроен, вы предоставляете учетные данные; а также учетные данные предоставляются в 'onReceivedHttpAuthRequest'. Не могли бы вы зайти в журнал, который активен (может быть, и тот, и другой) при первом запуске (который работает) и на последующих запусках (которые не работают)? –

+0

showHttpAuthDialog - абсолютно бесполезная функция, можете прокомментировать это. Однако onReceivedHttpAuthRequest используется для аутентификации страницы. и тот, что был в предыдущем классе, используется для получения учетных данных и имени хоста при первом входе в систему. Что я пытаюсь сделать, так это то, что я хочу, чтобы они запоминали эти учетные данные и URL-адрес, когда я переключаюсь между экранами. Как бы это ни казалось забывает URL-адрес и отображается сообщение «страница не отображается». Интересно, чего не хватает. –

+0

Вызывается ли 'onReceivedHttpAuthRequest', когда вы вернетесь? –

ответ

2

Ok.

вы должны добавить имя пользователя/пароль в onResume вместо OnCreate

нравится объяснить в этом документе http://developer.android.com/reference/android/app/Activity.html

+0

все еще не повезло, интересно, почему он не помнит пароль или URL страницы во второй раз –

+0

На самом деле это жизненный цикл фрагмента здесь: http://developer.android.com/guide/components/fragments.html. Я не знаю, нуждается ли фрагмент в SetRetainInstance (true) в onCreate. Но с этим веб-просмотром я не думаю, что он нужен ... – Solostaran14

1

Переместить код SharedPref в OnClick и отчет здесь ...

+0

Не могли бы вы объяснить программно? Я не уверен, что сообщение здесь означает –

1

Этот это проблема управления файлами cookie.

CASE: ~ 1 ЕСЛИ вы посещаете другой сайт (facebook, gmail и т. Д.) Чтобы решить эту проблему, вам необходимо сохранить файлы cookie, которые проходили через vebView.

& отправьте его в следующий раз, когда запрос на новую страницу.

СЛУЧАЙ: ~ 2 если вы посещаете свой собственный веб-сайт, то есть один и другое решение проблемы, что вы можете проверить на стороне сервера (в вашем веб-сайт) Информация об устройстве & сравнить его с этой информацией устройства, которое было при входе в систему время.

или вы можете отправить скрытые данные в скрытом теге & проверить его в своем приложении.

1

В моем предыдущем проекте у меня возникла аналогичная проблема. Я решаю там в этом подходе - запускать пустую/стандартную компоновку в onCreate, затем загрузить конфигурацию из sharedPref и установить значение параметра для макета внутри onResume. и перед тем, как покинуть страницу, сохраните изменения конфигурации (если произойдет) внутри onPause. Если это выглядит хорошо, вы можете проверить его в своем случае.

+0

1 проголосуйте за то, что нашли время ответить :). Попробуйте поставить этот вопрос, если у вас есть какие-либо подсказки: http: //stackoverflow.com/questions/18343590/how-do-i- смещаться-заместитель, включает макет-к-нижнюю-оф-зрения/18344303? noredirect = 1 # comment26937643_18344303 –