0

I' am facing two issues in android webview.

  1. Screen displaying blank when the screen orientation changes. and
  2. To store cookies(username and passwords) permanently, Presently it storing for only one day, when I open my app in next day, it is asking the login credentials once again.

Please help me . Thank you

public class MainActivity extends AppCompatActivity {
private WebView webView;
ProgressBar webpageprogressbar;

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

    webView = (WebView) findViewById(R.id.webView2);
    webpageprogressbar = (ProgressBar) findViewById(R.id.progressBar);
    webpageprogressbar.setProgress(0);
    webpageprogressbar.setMax(100);
    MainActivity.this.webpageprogressbar.setProgress(0);

    if(savedInstanceState !=null)
    {
        webView.restoreState(savedInstanceState);
    }else {
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAllowFileAccess(true);
    }
    CookieSyncManager.createInstance(MainActivity.this);
    CookieManager manager = new CookieManager();
    Log.i("My APP","At onCreate");
    manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);

    final Activity activity = this;

    webView.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                WebView web = (WebView) v;

                switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                        if (web.canGoBack()) {
                            web.goBack();
                            return true;
                        }
                        break;
                }
            }
            return false;
        }
    });


    webView.setWebViewClient(new WebViewClient()
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.d("My APP","At shouldOverrideRlLoading");
            view.loadUrl(url);
            return  true;
        }

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

            Log.d("My APP", "At onPageFinished");
            CookieSyncManager.getInstance().sync();
            super.onPageFinished(view, url);
        }
    });

    webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            MainActivity.this.setValue(newProgress);
            if(newProgress ==100)
            {
                webpageprogressbar.setVisibility(View.GONE);
            }else {
                webpageprogressbar.setVisibility(View.VISIBLE);
            }

        }
    });
    if (savedInstanceState == null) {
        Log.d("My APP","At savedInstanceState");
        webView.loadUrl("http://google.com");
    }
    if (Build.VERSION.SDK_INT >= 19) {
        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    }


}

public void setValue(int progress) {
    MainActivity.this.webpageprogressbar.setProgress(progress);
}
@Override
// Detect when the back button is pressed
public void onBackPressed() {

    if(webView.canGoBack()) {

        webView.goBack();

    } else {
        // Let the system handle the back button
        super.onBackPressed();
    }
}


@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
    webView.saveState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    webView.restoreState(savedInstanceState);
}

@Override
protected void onResume() {
    Log.d("My APP","At onResume");
    CookieSyncManager.getInstance().startSync();
    super.onResume();
}

@Override
protected void onStart() {
    super.onStart();
}

@Override
protected void onPause() {
    Log.d("My APP","At onPause");
    CookieSyncManager.getInstance().stopSync();
    super.onPause();
}

@Override
protected void onStop() {
    super.onStop();
}

@Override
protected void onRestart() {
    super.onRestart();
}

@Override
protected void onDestroy() {
    super.onDestroy();
}

} 

Manifest file:-

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:configChanges="orientation|screenSize"
    android:theme="@style/AppTheme" >
Karan
  • 252
  • 1
  • 11

1 Answers1

0

Add undermentioned tag to your manifest file in where the activity is declared:

android:configChanges="keyboardHidden|orientation|screenSize"

eg:<activity android:name="com.test.MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:screenOrientation="landscape" />

To Store cookie:

// Create instance
CookieSyncManager syncManager = CookieSyncManager.createInstance(webView.getContext());
// Get instance
CookieManager cookieManager = CookieManager.getInstance();
// Set cookie
cookieManager.setCookie();
// Sync cookie
syncManager.sync();

feel free to ask for any query.

Vibhor Chopra
  • 647
  • 4
  • 14
  • Thanks for the reply. The Screen still displaying blank screen along with completed progress bar (i.e 100%)...:( – Karan Nov 03 '15 at 06:45
  • Please Refer: http://stackoverflow.com/questions/12131025/android-preventing-webview-reload-on-rotate. – Vibhor Chopra Nov 03 '15 at 06:54
  • Nope..:( No use.. :( Still the same problem persists. – Karan Nov 03 '15 at 07:04
  • You know the solution for cookies issue? how can i store it permanently.? – Karan Nov 04 '15 at 04:57
  • I have edited the code and added cookie sync code to it. – Vibhor Chopra Nov 04 '15 at 06:17
  • If I add CookieManager cookieManager = CookieManager.getInstance(); // Set cookie cookieManager.setCookie(); // Sync cookie syncManager.sync(); code snippet the back button method() wont work – Karan Nov 04 '15 at 08:27
  • Nope.. If I press back button at first page of my webview it will redirecting to same page itslef.. If I remove that code snippet.. It will ask for confirmation msg to exit app (which is actually I need.) – Karan Nov 04 '15 at 08:50
  • setcookie() should take parameters.. It cannot be blank. – Karan Nov 05 '15 at 05:08
  • If I open the application very next day, the cookies where deleted and it is again asking the login credentials. – Karan Nov 05 '15 at 06:12