¿Cómo arreglo la contraseña / autenticación de nombre de usuario en mi código?

Tengo una aplicación en la que inicio sesión con mi nombre de usuario y contraseña y luego cambio a una página que contiene una vista web. La vista web reconoce este nombre de usuario y contraseña y carga el contenido (a través de las preferencias compartidas), pero el problema es que se carga SOLO UNA VEZ y cuando navego a otra parte de mi aplicación y vuelvo, aparece una pantalla en blanco que finalmente carga la página no puede ser distribuido en la vista web. ¿Hay alguna forma de solucionar esto, para que la vista web reconozca el nombre de usuario y pase cada vez que navegue a la página y cargue el contenido? Aquí está el código para el mismo: La página que contiene la vista web:

public class AnswersFragmentWebView extends Fragment implements MainActivity.BackPressListener { 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); } } 

El cliente de la vista web:

 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(); } } 

¡Gracias! Justin

De acuerdo.

tienes que agregar el nombre de usuario / contraseña en onResume en lugar de OnCreate

como explicar en este documento http://developer.android.com/reference/android/app/Activity.html

Mueva el código SharedPref a onClick e informe aquí …

Este es el problema de la administración de cookies.

CASO: ~ 1 SI está visitando otro sitio web (facebook, gmail, etc.) Para resolver esto, debe mantener los archivos de cookies que venían a través de vebView.

y enviarlo de vuelta a la próxima solicitud de página nueva.

CASO: ~ 2 si está visitando su propio sitio web, entonces hay otra solución de problema: puede verificar la información del dispositivo del lado del servidor (en su sitio web) y compararla con la información del dispositivo que se encontraba al momento de iniciar sesión.

o puede enviar datos ocultos en tags ocultas y validarlas en su aplicación.

En mi proyecto anterior, me he enfrentado a un problema similar. Resuelvo allí en este enfoque: cree una instancia del diseño en blanco / predeterminado en onCreate , luego cargue la configuración de sharedPref y establezca el valor del parámetro para el diseño dentro de onResume . y antes de salir de la página, guarde los cambios de configuración (si sucede) dentro de Pausa . Si le parece bien, puede verificarlo en su caso.