GVKun编程网logo

Android Webview Cookie返回null(android webview cookies)

14

在本文中,我们将给您介绍关于AndroidWebviewCookie返回null的详细内容,并且为您解答androidwebviewcookies的相关问题,此外,我们还将为您提供关于Androidf

在本文中,我们将给您介绍关于Android Webview Cookie返回null的详细内容,并且为您解答android webview cookies的相关问题,此外,我们还将为您提供关于Android findViewById返回NULL、android getActivity.findViewById获取ListView 返回NULL的方法、android HttpClient+WebView 同步cookie、Android Webview Cookie无法像Chrome一样工作的知识。

本文目录一览:

Android Webview Cookie返回null(android webview cookies)

Android Webview Cookie返回null(android webview cookies)

我正在尝试简单地在android的webview中设置和检索cookie。我尝试了许多cookie管理器脚本来尝试使它工作。我启用了JavaScript。

在Samsung S3和Samsung Galaxy Tab 10.1上运行该应用程序时,cookie似乎根本没有设置(android
4.1)。但是,在Samsung Galaxy ace,HTC Desire Z和android模拟器中运行该软件时,将设置cookie并使其完全正常阅读。

当工作时,webview返回预期的字符串,当工作时,输出只是“ null”;cookie没有值/未设置。

我的特定情况还使用了滑动式Navigation类,它是Actionbar Sherlock的扩展。

非常感谢您的帮助,我已经为此苦苦挣扎了好几个星期。谢谢。

HTML:

<html><head>    <title>    </title><script>    function createCookie(name, value)     {            var day  = (1 * 24 * 60 * 60 * 1000);            var date = new Date();            date.setTime(date.getTime() + (20 * 365 * day));            var expires = "; expires=" + date.toGMTString();            document.cookie = name + ''=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'';            document.cookie = name + "=" + value + expires + "; path=/";    }    function readCookie(name)     {        var nameEQ = name + "=";        var ca = document.cookie.split('';'');        for(var i=0;i < ca.length;i++) {            var c = ca[i];            while (c.charAt(0)=='' '') c = c.substring(1,c.length);            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);        }        return null;    }</script></head><body><h1><script type="text/javascript">    createCookie("test", "If this is working, it returns this string. If this is not working, it returns null.");    document.write("test: " + readCookie("test"));</script></body></html>

Java代码:

公共类MainActivity扩展SherlockActivity实现ISideNavigationCallback {

public static final String EXTRA_TITLE = "com.devspark.sidenavigation.sample.extra.MTGOBJECT";public static final String EXTRA_RESOURCE_ID = "com.devspark.sidenavigation.sample.extra.RESOURCE_ID";public static final String EXTRA_MODE = "com.devspark.sidenavigation.sample.extra.MODE";public static String WebLoaded = "0";public static String page = "signup.php";private ImageView icon;private SideNavigationView sideNavigationView;private WebView engine;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    icon = (ImageView) findViewById(android.R.id.icon);    sideNavigationView = (SideNavigationView) findViewById(R.id.side_navigation_view);    sideNavigationView.setMenuItems(R.menu.side_navigation_menu);    sideNavigationView.setMenuClickCallback(this);    if (getIntent().hasExtra(EXTRA_TITLE)) {        String title = getIntent().getStringExtra(EXTRA_TITLE);        int resId = getIntent().getIntExtra(EXTRA_RESOURCE_ID, 0);        setTitle(title);        icon.setImageResource(resId);        sideNavigationView.setMode(getIntent().getIntExtra(EXTRA_MODE, 0) == 0 ? Mode.LEFT : Mode.RIGHT);    }   //test    getSupportActionBar().setDisplayHomeAsUpEnabled(true);    String domain = "localhost";    CookieManager cookieManager = CookieManager.getInstance();    cookieManager.setAcceptCookie(true);    cookieManager.setCookie(domain, "name=value");    cookieManager.setCookie(domain, "path=/");    cookieManager.setCookie(domain, "HttpOnly");    //enable cookies    CookieManager.getInstance().setAcceptCookie(true);    //navigates web engine, including on nav click    engine = (WebView) findViewById(R.id.web_engine);    engine.loadUrl("file:///android_asset/" + page);    //enable JavaScript support - disabled by default for some weird reason    engine.getSettings().setJavaScriptEnabled(true);      engine.setWebViewClient(new WebViewClient());    //disables text selection    engine.setOnLongClickListener(new View.OnLongClickListener() {        public boolean onLongClick(View v) {            return true;        }    });     }@Overridepublic void onPause(){    super.onPause();    engine.getSettings().setJavaScriptEnabled(false);}@Overridepublic void onResume(){    super.onResume();    engine.getSettings().setJavaScriptEnabled(true);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {        case android.R.id.home:            sideNavigationView.toggleMenu();            break;        case R.id.mode_left:            item.setChecked(true);            sideNavigationView.setMode(Mode.LEFT);            break;        case R.id.mode_right:            item.setChecked(true);            sideNavigationView.setMode(Mode.RIGHT);            break;        default:            return super.onOptionsItemSelected(item);    }    return true;}@Overridepublic void onSideNavigationItemClick(int itemId) {    switch (itemId) {        case R.id.side_navigation_menu_item1:            invokeActivity(getString(R.string.title1), R.drawable.ic_android1);                 page = "index.html";            break;        case R.id.side_navigation_menu_item2:            invokeActivity(getString(R.string.title2), R.drawable.ic_android2);            page = "test.html";            break;        case R.id.side_navigation_menu_item3:            invokeActivity(getString(R.string.title3), R.drawable.ic_android3);            break;        case R.id.side_navigation_menu_item4:            invokeActivity(getString(R.string.title4), R.drawable.ic_android4);            break;        case R.id.side_navigation_menu_item5:            invokeActivity(getString(R.string.title5), R.drawable.ic_android5);            break;        default:            return;    }    finish();}

答案1

小编典典

经过一个多月的研究,我得出结论,在文件位于localhost(直接从assets文件夹中读取)的webview中,无法在高于2.3的android版本中设置cookie。

我经历了使用cookie存储的多种选择,包括使用HTML的localstorage。我被认为可以相信,这里的整个问题都是安全性。如果要在本地主机上创建cookie或localstorage,则其他应用程序可以访问该存储,因此是主要的安全威胁。

我的最终问题是尝试通过Java与Java的双向通信来桥接Webview,并且在此过程中还需要存储数据。我的解决方案是利用
JavascriptInterface

这个想法如下:

  • 解析数据以在javascript中起作用
  • Javascript调用特殊的JavaScript函数,例如“ setData(myDataName,myData)”
  • Java有一个侦听此函数的函数,它将接受javscript设置的参数,并且还可以将值返回给javascript。
  • 将数据解析为Java之后,java会将其存储在资产中的一系列文件中。
  • 当调用javascript函数“ getData(myDataName)”时,Java用相同的方法返回数据。

我发现这非常有用:Android JavascriptInterface
文档,在Android
2.3中处理JavascriptInterface

我发现的唯一主要“问题”是Android
2.3(已在3.0中修复)中一个相当严重的错误,该错误有效地破坏了JavascriptInterface。上面的第二个链接描述了我发现的最佳解决方法。

这是一个如何使双向通信正常工作的示例(虽然很杂乱,但是可以工作):

自定义网络界面类:

public class webViewInterface {     //@JavascriptInterface //for SDK 12+    public String showToast(String myText) {        Toast.makeText(context, myText, Toast.LENGTH_LONG).show();        return myText;    }    }

主类:受保护的void onCreate(Bundle
savedInstanceState){super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);engine = (WebView) findViewById(R.id.web_engine);context = this;WebSettings webSettings = engine.getSettings();webSettings.setJavaScriptEnabled(true);engine.setWebViewClient(new WebViewClient());engine.loadUrl("file:///android_asset/" + page);boolean javascriptInterfaceBroken = false;try {        if (Build.VERSION.RELEASE.startsWith("2.3")) {         javascriptInterfaceBroken = true;        }    } catch (Exception e) {    // Ignore, and assume user javascript interface is working correctly.    }// Add javascript interface only if it''s not broken    // @TODO: write the workaround for < 2.3 devicesif (!javascriptInterfaceBroken) {        engine.addJavascriptInterface(new webViewInterface(), "MainActivityInterface");}//disables text selectionengine.setOnLongClickListener(new View.OnLongClickListener() {    public boolean onLongClick(View v) {        return true;    }});     }

HTML:

<html><head></head><body><input type="button" value="Say hello" onClick="showAndroidToast();" /><script type="text/javascript">    function showAndroidToast() {        document.write(MainActivityInterface.showToast("eureka!"));    }</script></body></html>

Android findViewById返回NULL

Android findViewById返回NULL

有时我的xml视图有一个奇怪的问题,并且包含在Android Eclipse SDK中的子元素.

例如,我有一个名为main.xml的xml视图,其中的LinearLayout和TextView是唯一的子级,其ID为textView1.一切正常(长时间).当进行一些主要的代码更改时,可能会发生findViewById(R.id.textView1);开始返回null.重新编译不会改变任何东西.真奇怪

一段时间后,我找到了一种解决方法…我将main.xml复制到main2.xml,并将setContentView(R.layout.main)更改为setContentView(R.layout.main2),并且一切正常,g继续进行,没有任何改变布局参考,甚至仅复制布局本身.没有内容被修改.在第一次运行之后,我可以删除main2.xml并将布局设置回R.layout.main.没有更多的NullPointerException.

有人知道发生了什么问题以及如何在不执行愚蠢的复制操作的情况下解决此问题吗?

最好,
哈克牛排

解决方法:

如果Eclipse有问题(例如强制关闭),这恰好发生在我身上.它对我有用的是清理项目,直到获得所有资源和引用为止.

android getActivity.findViewById获取ListView 返回NULL的方法

android getActivity.findViewById获取ListView 返回NULL的方法

在控件ID正确的情况下,检查是否在实例化布局文件之后,获取LISTVIEW,

先inflate找layout下布局文件,并实例化后才能获得Listview的ID

demo:

public class FragmentPage extends Fragment { 
View view = null;

  @Override 
  @SuppressLint("HandlerLeak") 
  public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

         view = inflater.inflate(R.layout.fragment_2,null);

        

      // @此处获取使用view.findViewById(list的ID);

   

    //最后返回加载后的布局文件 
    return view;

  }

}

以上就是小编为大家带来的android getActivity.findViewById获取ListView 返回NULL的方法全部内容了,希望大家多多支持编程小技巧~

android HttpClient+WebView 同步cookie

android HttpClient+WebView 同步cookie

android客户端通过httpClient或者httpUrlConnection进行登录后,为了把登录状态同步到webView中,这时需要进行cookie的同步


参考:http://segmentfault.com/a/1190000002877843


一.cookie同步方式

下面是登录线程:

public class LoginThread extends Thread{
		
	private Handler loginHandler; 
	
	public  LoginThread(Handler loginHandler) {
		this.loginHandler = loginHandler;
	}
	@Override
	public void run() 
	{
		List<String> cookieLst = new ArrayList<String>();
		HttpParams httpParams = new BasicHttpParams();
		ConnManagerParams.setMaxTotalConnections(httpParams, 5);
		ConnManagerParams.setTimeout(httpParams, 15*1000);
		HttpConnectionParams.setSoTimeout(httpParams, 10*1000);
		HttpConnectionParams.setTcpNoDelay(httpParams, true);
		HttpPost httpPost = new HttpPost("http://192.168.1.107/cookie/login.php");
		List<NameValuePair> nvPairs = new ArrayList<NameValuePair>();
		nvPairs.add(new BasicNameValuePair("name", "lisi"));
		nvPairs.add(new BasicNameValuePair("age","22"));
		nvPairs.add(new BasicNameValuePair("gender", "男"));
		
		try {
			UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nvPairs, HTTP.UTF_8);
			httpPost.setEntity(entity);
			HttpClient httpClient =  new DefaultHttpClient();
			
			 //Cookie可能获取不到,因此有必要调用浏览器兼容模式
			HttpClientParams.setCookiePolicy(httpClient.getParams(), CookiePolicy.BROWSER_COMPATIBILITY);  
			   
			HttpResponse httpResponse = httpClient.execute(httpPost);
			if(httpResponse!=null && httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
			{
			 	String content = EntityUtils.toString(httpResponse.getEntity());
			 	Log.d("LOGIN", content);
			 	Header[] allHeaders = httpResponse.getAllHeaders();
			 	if(allHeaders!=null)
			 	{
			 		//获取cookie的第一种方式
			 		for (Header header : allHeaders)
			 		{
			 			Log.d("LOGIN", header.getName()+"="+header.getValue());
			 			if("Set-Cookie".equalsIgnoreCase(header.getName()))
			 			{
			 				cookieLst.add(header.getValue());
			 			}
					}
			 	}
			 	//获取cookie的第二种方式
			 	AbstractHttpClient abstractHttpClient = (AbstractHttpClient) httpClient;
			 	CookieStore cookieStore = abstractHttpClient.getCookieStore();
			 	List<Cookie> cookies = cookieStore.getCookies();
			 	for (Cookie cookie : cookies) 
			 	{
			 		Log.d("LOGIN-COOKIE", cookie.getName()+"="+cookie.getValue()+",path="+cookie.getPath()+",domain="+cookie.getDomain()+",expires="+cookie.getExpiryDate());
				}
			 	
			 	if(loginHandler!=null)
 				{
 					Message msg = new Message();
 					msg.obj = cookieLst;
 					msg.what = 200;
 					msg.setTarget(loginHandler);
 					msg.sendToTarget();
 				}
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

下面是WebView主页面Activity

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
public class Main extends Activity implements DownloadListener {
	
	private WebView mWebView;
	
	//extraHeaders经测试不可以同步cookie
	private Map<String, String> extraHeaders;
	
	private final String TAG = "WEB_VIEW";
	
	private final Handler loginHandler = new Handler(){
		
		@Override
		public void handleMessage(Message msg) {
			
			if(msg.what==200)
			{
				List<String> cookies =  (List<String>) msg.obj;
				if(cookies!=null)
				{	
					syncCookieToWebView(cookies);
					mWebView.loadUrl("http://192.168.1.107/cookie/read.php");
				}
			}else{
				super.handleMessage(msg);
			}
		}
		
	};
	
	@SuppressLint("SetJavaScriptEnabled") 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mWebView = (WebView) findViewById(R.id.main_webview);
		WebSettings settings = mWebView.getSettings();
		settings.setAppCacheEnabled(true);
		settings.setCacheMode(WebSettings.LOAD_DEFAULT);
		settings.setGeolocationEnabled(true);
		settings.setUseWideViewPort(true);
		settings.setSaveFormData(true);
		settings.setSavePassword(true);
		settings.setSupportZoom(false);
		settings.setLoadsImagesAutomatically(true);
		settings.setBlockNetworkImage(false);
		if(android.os.Build.VERSION.SDK_INT>=11)
		{
			settings.setEnableSmoothTransition(true);
		}
		settings.setJavaScriptCanOpenWindowsAutomatically(false);
		settings.setAllowFileAccess(false);
		settings.setJavaScriptEnabled(true);
		String userAgent = settings.getUserAgentString();
		Log.d(TAG, userAgent);
		if(android.os.Build.VERSION.SDK_INT>=14)
		{
			mWebView.setFitsSystemWindows(true);
		}
		if(mWebView.isHardwareAccelerated())
		{
			mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
		}
		mWebView.setKeepScreenOn(true);
		extraHeaders = new IdentityHashMap<String, String>();
		
		mWebView.setWebViewClient(new WebViewClient(){
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				if(view!=null && !TextUtils.isEmpty(url))
				{
					extraHeaders.put("control-cache", "no-cache,private");
					extraHeaders.put("pragma", "no-cache,no-store");
					extraHeaders.put("expires", "0");
					view.loadUrl(url, extraHeaders);
					return true;
				}
				return super.shouldOverrideUrlLoading(view, url);
			}
		});
		
		mWebView.setDownloadListener(this);
		
		//mWebView.loadUrl("http://shouji.baidu.com/software/?from=web_alad_multi");
		new LoginThread(loginHandler).start();
	}
	//销毁webView
	@Override
	protected void onDestroy() {
		super.onDestroy();
		mWebView.clearFormData();
		mWebView.clearHistory();
		mWebView.destroy();
	}
	
	//监听文件下载,WebView不会自动下载,需要我们自己构建下载代码
	@Override
	public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype, long contentLength) 
	{
		Log.d(TAG, "url="+url);
		Log.d(TAG, "userAgent="+url);
		Log.d(TAG, "contentDisposition="+contentDisposition);
		Log.d(TAG, "mimetype="+mimetype);
		Log.d(TAG, "contentLength="+contentLength);
		
		//第一种下载方式是 自定义的http工具类
		//new DownloadThread(url,contentDisposition,mimetype,contentLength).start();
		
		
		//第二种下载方式是调用系统的webView,具有默认的进度条
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setData(Uri.parse(url));
		startActivity(intent);
		
	}
	/**
	 * cookie同步
	 */
	private void syncCookieToWebView(List<String> cookies)
	{
		CookieSyncManager.createInstance(Main.this);
		CookieManager cm = CookieManager.getInstance();
		cm.setAcceptCookie(true);
		if(cookies!=null)
		{
		    for (String cookie : cookies)
		    {
			cm.setCookie("http://192.168.1.107:80",cookie);//注意端口号和域名,这种方式可以同步所有cookie,包括sessionid
		     }
		}
		CookieSyncManager.getInstance().sync();
	}
}


二.注意:平时开发中Cookie同步是最佳选项,但这并不意味着一定需要使用cookie同步,我们可以使用  token+用户id+登录时间校验码  进行同步登录


三.对于使用javaInterface进行同步登录的问题

javaInterface风险性很高,如果android平台是 4.2+比较安全,但4.2以下版本,安全性不容乐观,比如通过反射造成硬盘被读写的可能性很高!

在android 4.2中增加了 @javainterface注解,并且将公开的方法异步化,这样有效的控制了某些没必要公开的方法被无意间作为接口公开,导致js发射到硬盘的读写io类,从而发生文件被窃取,垃圾文件堆积,有害文件被下载等问题!


四.目前来说让所有人使用 4.2+以上版本可能性不大,但尽量少使用javainterface,转而使用  协议的方式,所谓协议,就是通信协议,我们可以分析url参数,从而进行webView和native代码的通信

mWebView.setWebViewClient(new WebViewClient(){
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				
			//捕获url的参数值
			
			if(url.indexOf("login")>=0)
			{
			    //客户端代码执行某部分操作----->执行完毕后通过url参数把执行结果返回webView
			    
			}else if(url.indexOf("userCenter")>=0){
			    //客户端代码执行某部分操作----->执行完毕后通过url参数把执行结果返回webView
			}
			return super.shouldOverrideUrlLoading(view, url);
			}
		});

当然,javainterface不推荐,但完全可以使用

view.loadUrl("javascript:dosometing("+"''参数''"+")");


-------------------------------2015-04-30-更新,从webView读取cookie--------------------------------

private class MyWebViewClient extends WebViewClient {

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            webview.loadUrl(url);
            return true;
        }

        public void onPageFinished(WebView view, String url) {
            CookieManager cookieManager = CookieManager.getInstance();
            String CookieStr = cookieManager.getCookie(url);
            Log.e("sunzn", "Cookies = " + CookieStr);
            super.onPageFinished(view, url);
        }

    }



Android Webview Cookie无法像Chrome一样工作

Android Webview Cookie无法像Chrome一样工作

如何解决Android Webview Cookie无法像Chrome一样工作?

我有一个页面,其中包含一些复选框以标记为投票目的。当使用chrome并投票打开此页面时,重新打开该页面后将显示复选框标记的正确状态。但是当使用android webview做同样的事情时,它不起作用。 对此可以有任何帮助。 我已经为cookiemanager.setAcceptCookie(true)cookieManager.setAcceptThirdPartyCookies(webview,true)添加了代码,但是没有用。

在android webview中重新打开并单击其他组件并返回更改后,该更改也反映出来。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

今天关于Android Webview Cookie返回nullandroid webview cookies的介绍到此结束,谢谢您的阅读,有关Android findViewById返回NULL、android getActivity.findViewById获取ListView 返回NULL的方法、android HttpClient+WebView 同步cookie、Android Webview Cookie无法像Chrome一样工作等更多相关知识的信息可以在本站进行查询。

本文标签: