doudou6050 2012-12-08 00:14
浏览 75
已采纳

Android WebView选项卡使用Cookie浏览

My app has a 3-tabbed ActionBar layout. The 3 tabs are Dashboard, Feed and Messages.

When you click any of the three, the application is supposed to create a WebView of www.flyalaskava.org/incog/mobile/ which - if you do not have an active session for - will display an image and a "log-in with facebook" button.

The problem is, when I load the first tab (Dashboard) and cliek Log-In with Facebook, it logs me in - but as soon as I click onto another tab, I lose my session and am re-prompted.

Please keep in mind that currently all of these are using the same php file and that the log-in system works perfectly outside of Android. Sorry if this is a newbie question - any help is appreciated.

package com.example.testing;

import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NavUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;

import com.handmark.pulltorefresh.library.PullToRefreshWebView;

public class Main extends FragmentActivity implements ActionBar.TabListener {

    PullToRefreshWebView mPullRefreshWebView;
    WebView mWebView;

    /**
     * The serialization (saved instance state) Bundle key representing the
     * current tab position.
     */
    private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";

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

        mPullRefreshWebView = (PullToRefreshWebView) findViewById(R.id.pull_refresh_webview);
        mWebView = mPullRefreshWebView.getRefreshableView();

        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new SampleWebViewClient());
        mWebView.loadUrl("http://www.google.com");

        // Set up the action bar to show tabs.
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // For each of the sections in the app, add a tab to the action bar.
        actionBar.addTab(actionBar.newTab().setText(R.string.title_section1)
            .setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText(R.string.title_section2)
            .setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText(R.string.title_section3)
            .setTabListener(this));
    }

    private static class SampleWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        // Restore the previously serialized current tab position.
        if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
            getActionBar().setSelectedNavigationItem(
                savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM)
            );
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        // Serialize the current tab position.
        outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar()
            .getSelectedNavigationIndex());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_settings:
                displayAlert();
                break;
            case R.id.menu_exit:
                displayExit();
                break;
            default:; 
        }
        return(super.onOptionsItemSelected(item));
    }

    public  void displayAlert() {
        new AlertDialog.Builder(this)
            .setMessage("This Application was created by Grant Adkins")
            .setTitle("About")  
            .setCancelable(false)  
            .setNeutralButton(android.R.string.ok,  
                new DialogInterface.OnClickListener() {  
                    public void onClick(DialogInterface dialog, int whichButton){
                        dialog.cancel();
                    }  
                }
            )  
            .show(); 
    }

    public  void displayExit() {
        new AlertDialog.Builder(this).setMessage("Exit the application")  
            .setTitle("Are you sure?")  
            .setCancelable(false)  
            .setNeutralButton(android.R.string.no,  
                new DialogInterface.OnClickListener() {  
                    public void onClick(DialogInterface dialog, int whichButton){
                        dialog.cancel();
                    }  
                }).setPositiveButton(android.R.string.yes,  
                    new DialogInterface.OnClickListener() {  
                        public void onClick(DialogInterface dialog, int whichButton){
                            finish();
                        }  
                    }
                ) 
            .show(); 
    }
    public boolean isOnline() {
        ConnectivityManager cm = 
            (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        String summary = "<html><body>No Network Connection.</body></html>";
        mWebView.loadData(summary, "text/html", null);
        return false;
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, show the tab contents in the
        // container view
        int page = tab.getPosition() + 1;
        if(page == 1) {
            /// eventually is going to load index.php?content=dashboard
            mWebView.loadUrl("http://www.flyalaskava.org/incog/mobile/");
            isOnline();
        } else if (page == 2) {
            /// eventually is going to load index.php?content=messages
            mWebView.loadUrl("http://www.flyalaskava.org/incog/mobile/");
            isOnline();
        } else if (page == 3) {
            /// eventually is going to load index.php?content=feed
            mWebView.loadUrl("http://www.flyalaskava.org/incog/mobile/");
            isOnline();
        } else {
            mWebView.loadUrl("http://www.google.com");
            isOnline();
        }
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    /**
     * A dummy fragment representing a section of the app, but that simply
     * displays dummy text.
     */
    public static class DummySectionFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public static final String ARG_SECTION_NUMBER = "section_number";

        public DummySectionFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // Create a new TextView and set its text to the fragment's section
            // number argument value.
            TextView textView = new TextView(getActivity());
            textView.setGravity(Gravity.CENTER);
            textView.setText(
                Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER))
            );

            return textView;
        }
    }
}`

*\\\\\\\\UPDATE\\\\\\*

I found this article which seems to be a similar problem, maybe because im using mWebView.loadUrl("http://www.flyalaskava.org/incog/mobile/"); it is acting like a new browser, is there any way to change urls without using that method.

Here is a picture of the problem.

  • 写回答

2条回答 默认 最新

  • donglun7151 2012-12-08 00:31
    关注

    Add the following lines after having created your WebView :

    CookieSyncManager.createInstance(mWebView.getContext()).sync();
    CookieManager.getInstance().acceptCookie();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码