Android webview使用详解

打开网页时不调用系统浏览器, 而是在本WebView中显示: ![复制代码](http://common.cnblogs.com/images/copycode.gif) mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); ![复制代码](http://common.cnblogs.com/images/copycode.gif) 通过java代码调用javascript ![复制代码](http://common.cnblogs.com/images/copycode.gif) WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { webview.loadUrl("javascript:wave()"); } }); } }, "demo"); ![复制代码](http://common.cnblogs.com/images/copycode.gif) 按返回键时, 不退出程序而是返回上一浏览页面: ![复制代码](http://common.cnblogs.com/images/copycode.gif) public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } ![复制代码](http://common.cnblogs.com/images/copycode.gif) 打开页面时, 自适应屏幕: WebSettings webSettings = mWebView .getSettings(); webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放 webSettings.setLoadWithOverviewMode(true); 便页面支持缩放: WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true); webSettings.setSupportZoom(true); 6.如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。 ...

2016年11月21日 · 5 分钟 · 天边的星星

Android23以上动态鉴权实现的方法及思路

直接上代码了,主要使用到onRequestPermissionsResult、requestPermissions和checkSelfPermission 方法 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_PERMISSIONS: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission Granted scanIntent(); } else { // Permission Denied Toast.makeText(getActivity(), “您拒绝了权限(请到设置中设置权限)”, Toast.LENGTH_SHORT) .show(); } break; case 300: test2(); break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } public void checkPermission() { if (Build.VERSION.SDK_INT >= 23) { // int write = getActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); // int read = getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE); int write = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE); int read = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE); if (write != PackageManager.PERMISSION_GRANTED || read != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 300); } else { test2(); } } else { test2(); } } ...

2016年11月18日 · 1 分钟 · 天边的星星

在html页面中判断本地app是否安装并打开

html中其实是无法判断应用是否安装,除非在webview中通过js bridge,这里通过一种方式达到此目的。 1、编辑AndroidManifest.xml: 主要是增加第二个,myapp用来标识schema,最好能保证手机系统唯一,那样就可以打开应用,而不是弹出一个选择框。 Android:pathPrefix标识url的path,可以附带自己的数据通过string传递到activity,比如完整url为 myapp://xxx/openwith?data=mydata **[html]** [view plain](http://blog.csdn.net/vinrex/article/details/38082759#) [copy](http://blog.csdn.net/vinrex/article/details/38082759#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1" data-mce-fragment="1"> </embed> </div> </div> - <span class="tag"><</span><span class="tag-name">activity</span> - <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;com.abc.MainActivity&#8221;</span> - <span class="attribute">android:configChanges</span>=<span class="attribute-value">&#8220;orientation|keyboardHidden|navigation|screenSize&#8221;</span> - <span class="attribute">android:screenOrientation</span>=<span class="attribute-value">&#8220;landscape&#8221;</span> - <span class="attribute">android:theme</span>=<span class="attribute-value">&#8220;@android:style/Theme.NoTitleBar.Fullscreen&#8221;</span> <span class="tag">></span> - <span class="tag"><</span><span class="tag-name">intent-filter</span><span class="tag">></span> - <span class="tag"><</span><span class="tag-name">action</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.action.MAIN&#8221;</span> <span class="tag">/></span> - <span class="tag"><</span><span class="tag-name">category</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.category.LAUNCHER&#8221;</span> <span class="tag">/></span> - <span class="tag"></</span><span class="tag-name">intent-filter</span><span class="tag">></span> - <span class="tag"><</span><span class="tag-name">intent-filter</span><span class="tag">></span> - <span class="tag"><</span><span class="tag-name">action</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.action.VIEW&#8221;</span> <span class="tag">/></span> - <span class="tag"><</span><span class="tag-name">category</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.category.BROWSABLE&#8221;</span> <span class="tag">/></span> - <span class="tag"><</span><span class="tag-name">category</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.category.DEFAULT&#8221;</span><span class="tag">/></span> - <span class="tag"><</span><span class="tag-name">data</span> <span class="attribute">android:scheme</span>=<span class="attribute-value">&#8220;myapp&#8221;</span> <span class="attribute">android:pathPrefix</span>=<span class="attribute-value">&#8220;/xxx/openwith&#8221;</span> <span class="tag">/></span> - <span class="tag"></</span><span class="tag-name">intent-filter</span><span class="tag">></span> - t;/activity<span class="tag">></span> 然后通过activity获得data数据: ...

2016年11月15日 · 1 分钟 · 天边的星星

Android获取点击的图片的颜色

获取图片中点击的颜色 import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends Activity { TextView touchedXY, invertedXY, imgSize, colorRGB; ImageView imgSource1, imgSource2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); touchedXY = (TextView)findViewById(R.id.xy); invertedXY = (TextView)findViewById(R.id.invertedxy); imgSize = (TextView)findViewById(R.id.size); colorRGB = (TextView)findViewById(R.id.colorrgb); imgSource1 = (ImageView)findViewById(R.id.source1); imgSource2 = (ImageView)findViewById(R.id.source2); imgSource1.setOnTouchListener(imgSourceOnTouchListener); imgSource2.setOnTouchListener(imgSourceOnTouchListener); } OnTouchListener imgSourceOnTouchListener = new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { float eventX = event.getX(); float eventY = event.getY(); float[] eventXY = new float[] {eventX, eventY}; Matrix invertMatrix = new Matrix(); ((ImageView)view).getImageMatrix().invert(invertMatrix); invertMatrix.mapPoints(eventXY); int x = Integer.valueOf((int)eventXY[0]); int y = Integer.valueOf((int)eventXY[1]); touchedXY.setText( “touched position: ” + String.valueOf(eventX) + ” / ” + String.valueOf(eventY)); invertedXY.setText(“touched position: ” + String.valueOf(x) + ” / ” + String.valueOf(y)); Drawable imgDrawable = ((ImageView)view).getDrawable(); Bitmap bitmap = ((BitmapDrawable)imgDrawable).getBitmap(); imgSize.setText(“drawable size: “+ String.valueOf(bitmap.getWidth()) + ” / “+ String.valueOf(bitmap.getHeight())); //Limit x, y range within bitmap if(x < 0){x = 0; } else if(x > bitmap.getWidth()-1) { x = bitmap.getWidth()-1; } if(y < 0){ y = 0; }else if(y > bitmap.getHeight()-1) { y = bitmap.getHeight()-1; } int touchedRGB = bitmap.getPixel(x, y); colorRGB.setText(“touched color: ” + “#” + Integer.toHexString(touchedRGB)); colorRGB.setTextColor(touchedRGB); return true; ...

2016年11月13日 · 2 分钟 · 天边的星星

Android-EditText 自定义带删除功能的EditText

我们经常在一些应用中见到输入框带有删除功能,今天我们就来实现这个功能(文字组织能力不强,大家随便看看)。主要是记录一下自己的学习经历,如果对大家有帮助,我会更开心的。 先上图: 实现要点: 1、当输入框为空时,删除按钮隐藏; 2、当输入框不为空时,显示删除按钮。 核心代码: `001.``package` `com.example.view;` <div class="line alt2"> `002.`<span class="content"><span class="block">`import` `com.example.ui.R;`</span></span> </div> <div class="line alt1"> `003.`<span class="content"><span class="block">`import` `android.content.Context;`</span></span> </div> <div class="line alt2"> `004.`<span class="content"><span class="block">`import` `android.graphics.Rect;`</span></span> </div> <div class="line alt1"> `005.`<span class="content"><span class="block">`import` `android.graphics.drawable.Drawable;`</span></span> </div> <div class="line alt2"> `006.`<span class="content"><span class="block">`import` `android.text.Editable;`</span></span> </div> <div class="line alt1"> `007.`<span class="content"><span class="block">`import` `android.text.TextWatcher;`</span></span> </div> <div class="line alt2"> `008.`<span class="content"><span class="block">`import` `android.util.AttributeSet;`</span></span> </div> <div class="line alt1"> `009.`<span class="content"><span class="block">`import` `android.view.MotionEvent;`</span></span> </div> <div class="line alt2"> `010.`<span class="content"><span class="block">`import` `android.view.View;`</span></span> </div> <div class="line alt1"> `011.`<span class="content"><span class="block">`import` `android.widget.EditText;`</span></span> </div> <div class="line alt2"> `012.`<span class="content"><span class="block">`import` `android.widget.Toast;`</span></span> </div> <div class="line alt1"> `013.`<span class="content"><span class="block">`import` `android.view.View.OnFocusChangeListener;;`</span></span> </div> <div class="line alt2"> `014.`<span class="content"><span class="block">`public` `class` `EditTextWithDelete ``extends` `EditText ``implements` `OnFocusChangeListener{`</span></span> </div> <div class="line alt1"> `015.`<span class="content"><span class="block">`private` `Drawable imgEnable;`</span></span> </div> <div class="line alt2"> `016.`<span class="content"><span class="block">`private` `Context context;`</span></span> </div> <div class="line alt1"> `017.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `018.`<span class="content"><span class="block">`public` `EditTextWithDelete(Context context) {`</span></span> </div> <div class="line alt1"> `019.`<span class="content"><span class="block">`super``(context);`</span></span> </div> <div class="line alt2"> `020.`<span class="content"><span class="block">`this``.context = context;`</span></span> </div> <div class="line alt1"> `021.`<span class="content"><span class="block">`init();`</span></span> </div> <div class="line alt2"> `022.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `023.`<span class="content"><span class="block">`public` `EditTextWithDelete(Context context, AttributeSet attrs, ``int` `defStyle) {`</span></span> </div> <div class="line alt2"> `024.`<span class="content"><span class="block">`super``(context, attrs, defStyle);`</span></span> </div> <div class="line alt1"> `025.`<span class="content"><span class="block">`this``.context = context;`</span></span> </div> <div class="line alt2"> `026.`<span class="content"><span class="block">`init();`</span></span> </div> <div class="line alt1"> `027.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt2"> `028.`<span class="content"><span class="block">`public` `EditTextWithDelete(Context context, AttributeSet attrs) {`</span></span> </div> <div class="line alt1"> `029.`<span class="content"><span class="block">`super``(context, attrs);`</span></span> </div> <div class="line alt2"> `030.`<span class="content"><span class="block">`this``.context = context;`</span></span> </div> <div class="line alt1"> `031.`<span class="content"><span class="block">`init();`</span></span> </div> <div class="line alt2"> `032.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `033.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `034.`<span class="content"><span class="block">`private` `void` `init() {`</span></span> </div> <div class="line alt1"> `035.`<span class="content"><span class="block">`//获取图片资源`</span></span> </div> <div class="line alt2"> `036.`<span class="content"><span class="block">`imgEnable = context.getResources().getDrawable(R.drawable.delete);`</span></span> </div> <div class="line alt1"> `037.`<span class="content"><span class="block">`addTextChangedListener(``new` `TextWatcher() {`</span></span> </div> <div class="line alt2"> `038.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt1"> `039.`<span class="content"><span class="block">`@Override`</span></span> </div> <div class="line alt2"> `040.`<span class="content"><span class="block">`public` `void` `onTextChanged(CharSequence s, ``int` `start, ``int` `before, ``int` `count) {`</span></span> </div> <div class="line alt1"> `041.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `042.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `043.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `044.`<span class="content"><span class="block">`@Override`</span></span> </div> <div class="line alt1"> `045.`<span class="content"><span class="block">`public` `void` `beforeTextChanged(CharSequence s, ``int` `start, ``int` `count,`</span></span> </div> <div class="line alt2"> `046.`<span class="content"><span class="block">`int` `after) {`</span></span> </div> <div class="line alt1"> `047.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `048.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `049.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `050.`<span class="content"><span class="block">`@Override`</span></span> </div> <div class="line alt1"> `051.`<span class="content"><span class="block">`public` `void` `afterTextChanged(Editable s) {`</span></span> </div> <div class="line alt2"> `052.`<span class="content"><span class="block">`setDrawable();`</span></span> </div> <div class="line alt1"> `053.`<span class="content"><span class="block">`Toast.makeText(context, getText(), ``10``).show();`</span></span> </div> <div class="line alt2"> `054.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `055.`<span class="content"><span class="block">`});`</span></span> </div> <div class="line alt2"> `056.`<span class="content"><span class="block">`setDrawable();`</span></span> </div> <div class="line alt1"> `057.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt2"> `058.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt1"> `059.`<span class="content"><span class="block">`/**`</span></span> </div> <div class="line alt2"> `060.`<span class="content"><span class="block">`* 设置删除图片`</span></span> </div> <div class="line alt1"> `061.`<span class="content"><span class="block">`*/`</span></span> </div> <div class="line alt2"> `062.`<span class="content"><span class="block">`private` `void` `setDrawable() {`</span></span> </div> <div class="line alt1"> `063.`<span class="content"><span class="block">`if``(length() == ````) {`</span></span> </div> <div class="line alt2"> `064.`<span class="content"><span class="block">`setCompoundDrawablesWithIntrinsicBounds(``null``, ``null``, ``null``, ``null``);`</span></span> </div> <div class="line alt1"> `065.`<span class="content"><span class="block">`}``else` `{`</span></span> </div> <div class="line alt2"> `066.`<span class="content"><span class="block">`setCompoundDrawablesWithIntrinsicBounds(``null``, ``null``, imgEnable, ``null``);`</span></span> </div> <div class="line alt1"> `067.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt2"> `068.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `069.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `070.`<span class="content"><span class="block">`/**`</span></span> </div> <div class="line alt1"> `071.`<span class="content"><span class="block">`* event.getX() 获取相对应自身左上角的X坐标`</span></span> </div> <div class="line alt2"> `072.`<span class="content"><span class="block">`* event.getY() 获取相对应自身左上角的Y坐标`</span></span> </div> <div class="line alt1"> `073.`<span class="content"><span class="block">`* getWidth() 获取控件的宽度`</span></span> </div> <div class="line alt2"> `074.`<span class="content"><span class="block">`* getTotalPaddingRight() 获取删除图标左边缘到控件右边缘的距离`</span></span> </div> <div class="line alt1"> `075.`<span class="content"><span class="block">`* getPaddingRight() 获取删除图标右边缘到控件右边缘的距离`</span></span> </div> <div class="line alt2"> `076.`<span class="content"><span class="block">`* getWidth() - getTotalPaddingRight() 计算删除图标左边缘到控件左边缘的距离`</span></span> </div> <div class="line alt1"> `077.`<span class="content"><span class="block">`* getWidth() - getPaddingRight() 计算删除图标右边缘到控件左边缘的距离`</span></span> </div> <div class="line alt2"> `078.`<span class="content"><span class="block">`*/`</span></span> </div> <div class="line alt1"> `079.`<span class="content"><span class="block">`@Override`</span></span> </div> <div class="line alt2"> `080.`<span class="content"><span class="block">`public` `boolean` `onTouchEvent(MotionEvent event) {`</span></span> </div> <div class="line alt1"> `081.`<span class="content"><span class="block">`if``(imgEnable != ``null` `&& event.getAction() == MotionEvent.ACTION_UP) {`</span></span> </div> <div class="line alt2"> `082.`<span class="content"><span class="block">`int` `x = (``int``) event.getX() ;`</span></span> </div> <div class="line alt1"> `083.`<span class="content"><span class="block">`//判断触摸点是否在水平范围内`</span></span> </div> <div class="line alt2"> `084.`<span class="content"><span class="block">`boolean` `isInnerWidth = (x &gt; (getWidth() - getTotalPaddingRight())) &&`</span></span> </div> <div class="line alt1"> `085.`<span class="content"><span class="block">`(x &lt; (getWidth() - getPaddingRight()));`</span></span> </div> <div class="line alt2"> `086.`<span class="content"><span class="block">`//获取删除图标的边界,返回一个Rect对象`</span></span> </div> <div class="line alt1"> `087.`<span class="content"><span class="block">`Rect rect = imgEnable.getBounds();`</span></span> </div> <div class="line alt2"> `088.`<span class="content"><span class="block">`//获取删除图标的高度`</span></span> </div> <div class="line alt1"> `089.`<span class="content"><span class="block">`int` `height = rect.height();`</span></span> </div> <div class="line alt2"> `090.`<span class="content"><span class="block">`int` `y = (``int``) event.getY();`</span></span> </div> <div class="line alt1"> `091.`<span class="content"><span class="block">`//计算图标底部到控件底部的距离`</span></span> </div> <div class="line alt2"> `092.`<span class="content"><span class="block">`int` `distance = (getHeight() - height) /``2``;`</span></span> </div> <div class="line alt1"> `093.`<span class="content"><span class="block">`//判断触摸点是否在竖直范围内(可能会有点误差)`</span></span> </div> <div class="line alt2"> `094.`<span class="content"><span class="block">`//触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标`</span></span> </div> <div class="line alt1"> `095.`<span class="content"><span class="block">`boolean` `isInnerHeight = (y &gt; distance) && (y &lt; (distance + height));`</span></span> </div> <div class="line alt2"> `096.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt1"> `097.`<span class="content"><span class="block">`if``(isInnerWidth && isInnerHeight) {`</span></span> </div> <div class="line alt2"> `098.`<span class="content"><span class="block">`setText(``""``);`</span></span> </div> <div class="line alt1"> `099.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt2"> `100.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt1"> `101.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt2"> `102.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt1"> `103.`<span class="content"><span class="block">`return` `super``.onTouchEvent(event);`</span></span> </div> <div class="line alt2"> `104.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `105.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt2"> `106.`<span class="content"><span class="block">`@Override`</span></span> </div> <div class="line alt1"> `107.`<span class="content"><span class="block">`protected` `void` `finalize() ``throws` `Throwable {`</span></span> </div> <div class="line alt2"> `108.`<span class="content"><span class="block">`super``.finalize();`</span></span> </div> <div class="line alt1"> `109.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt2"> `110.`<span class="content"><span class="block">`@Override`</span></span> </div> <div class="line alt1"> `111.`<span class="content"><span class="block">`public` `void` `onFocusChange(View v, ``boolean` `hasFocus) {`</span></span> </div> <div class="line alt2"> `112.`<span class="content"><span class="block">`if``(hasFocus) {`</span></span> </div> <div class="line alt1"> `113.`<span class="content"><span class="block">`setDrawable();`</span></span> </div> <div class="line alt2"> `114.`<span class="content"><span class="block">`}``else` `{`</span></span> </div> <div class="line alt1"> `115.`<span class="content"><span class="block">`setCompoundDrawablesWithIntrinsicBounds(``null``, ``null``, ``null``, ``null``);`</span></span> </div> <div class="line alt2"> `116.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt1"> `117.`<span class="content"><span class="block">`}`</span></span> </div> <div class="line alt2"> `118.`<span class="content"><span class="block"> </span></span> </div> <div class="line alt1"> `119.`<span class="content"><span class="block">`}`</span></span> </div> 代码注释很清楚,相信以大家的水平都会看的懂的。在这边,我就不多做解释了。如果有不明白的,可以给我留言,大家交流交流。 ...

2016年11月7日 · 5 分钟 · 天边的星星

Android WebView 与登录状态保持一致,建立SESSION会话

在登陆界面获取验证码的时候: ``` `new Thread(){ @Override public void run() { try { SharedPreferences spf = getSharedPreferences(<span class=“hljs-string”>“Cookie”</span>, Context<span class=“hljs-preprocessor”>.MODE</span>_PRIVATE)<span class=“hljs-comment”>;</span> HttpClient client = new DefaultHttpClient()&lt;span class="hljs-comment">;&lt;/span> HttpGet get = new HttpGet(Gloable&lt;span class="hljs-preprocessor">.DOLOAD&lt;/span>+&lt;span class="hljs-string">"code.gif"&lt;/span>)&lt;span class="hljs-comment">;&lt;/span> HttpResponse response = client&lt;span class="hljs-preprocessor">.execute&lt;/span>(get)&lt;span class="hljs-comment">;&lt;/span> Cookie cookie = ((AbstractHttpClient) client)&lt;span class="hljs-preprocessor">.getCookieStore&lt;/span>()&lt;span class="hljs-preprocessor">.getCookies&lt;/span>()&lt;span class="hljs-preprocessor">.get&lt;/span>(&lt;span class="hljs-number">0&lt;/span>)&lt;span class="hljs-comment">;&lt;/span> String sessionId = cookie&lt;span class="hljs-preprocessor">.getValue&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> SharedPreferences&lt;span class="hljs-preprocessor">.Editor&lt;/span> editor = spf&lt;span class="hljs-preprocessor">.edit&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> editor&lt;span class="hljs-preprocessor">.putString&lt;/span>(&lt;span class="hljs-string">"sessionId"&lt;/span>, sessionId)&lt;span class="hljs-comment">;&lt;/span> String cookieString = cookie&lt;span class="hljs-preprocessor">.getName&lt;/span>()+&lt;span class="hljs-string">"="&lt;/span>+cookie&lt;span class="hljs-preprocessor">.getValue&lt;/span>()+ &lt;span class="hljs-string">";domain="&lt;/span>+cookie&lt;span class="hljs-preprocessor">.getDomain&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> Log&lt;span class="hljs-preprocessor">.e&lt;/span>(&lt;span class="hljs-string">"test"&lt;/span>, &lt;span class="hljs-string">"cookieString:"&lt;/span>+cookieString)&lt;span class="hljs-comment">;&lt;/span> editor&lt;span class="hljs-preprocessor">.putString&lt;/span>(&lt;span class="hljs-string">"cookieString"&lt;/span>, cookieString)&lt;span class="hljs-comment">;&lt;/span> editor&lt;span class="hljs-preprocessor">.commit&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> Log&lt;span class="hljs-preprocessor">.i&lt;/span>(&lt;span class="hljs-string">"info"&lt;/span>, &lt;span class="hljs-string">"b--JSESSIONID="&lt;/span> + sessionId)&lt;span class="hljs-comment">;&lt;/span> if (response&lt;span class="hljs-preprocessor">.getStatusLine&lt;/span>()&lt;span class="hljs-preprocessor">.getStatusCode&lt;/span>() == &lt;span class="hljs-number">200&lt;/span>) { byte[] bytes = EntityUtils&lt;span class="hljs-preprocessor">.toByteArray&lt;/span>(response&lt;span class="hljs-preprocessor">.getEntity&lt;/span>())&lt;span class="hljs-comment">;&lt;/span> final Bitmap bitmap = BitmapFactory&lt;span class="hljs-preprocessor">.decodeByteArray&lt;/span>(bytes, &lt;span class="hljs-number">0&lt;/span>, bytes&lt;span class="hljs-preprocessor">.length&lt;/span>)&lt;span class="hljs-comment">;&lt;/span> runOnUiThread(new Runnable() { public void run() { Drawable drawable = new BitmapDrawable(bitmap)&lt;span class="hljs-comment">;&lt;/span> iv_showCode&lt;span class="hljs-preprocessor">.setBackgroundDrawable&lt;/span>(drawable)&lt;span class="hljs-comment">;&lt;/span> } })&lt;span class="hljs-comment">;&lt;/span> } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e&lt;span class="hljs-preprocessor">.printStackTrace&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> } catch (IOException e) { // TODO Auto-generated catch block e&lt;span class="hljs-preprocessor">.printStackTrace&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> } } }&lt;span class="hljs-preprocessor">.start&lt;/span>()&lt;span class="hljs-comment">;&lt;/span>` 在webview加载url之前: ``` `SharedPreferences spf = getSharedPreferences(&lt;span class="hljs-string">"Cookie"&lt;/span>, Context&lt;span class="hljs-preprocessor">.MODE&lt;/span>_PRIVATE)&lt;span class="hljs-comment">;&lt;/span> CookieSyncManager&lt;span class="hljs-preprocessor">.createInstance&lt;/span>(this)&lt;span class="hljs-comment">;&lt;/span> CookieManager cookieManager = CookieManager&lt;span class="hljs-preprocessor">.getInstance&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> String cookieString = spf&lt;span class="hljs-preprocessor">.getString&lt;/span>(&lt;span class="hljs-string">"cookieString"&lt;/span>, &lt;span class="hljs-string">""&lt;/span>)&lt;span class="hljs-comment">;&lt;/span> cookieManager&lt;span class="hljs-preprocessor">.setCookie&lt;/span>(url, cookieString)&lt;span class="hljs-comment">;&lt;/span> CookieSyncManager&lt;span class="hljs-preprocessor">.getInstance&lt;/span>()&lt;span class="hljs-preprocessor">.sync&lt;/span>()&lt;span class="hljs-comment">;&lt;/span> webview&lt;span class="hljs-preprocessor">.loadUrl&lt;/span>(url)&lt;span class="hljs-comment">;&lt;/span>` android客户端通过httpClient或者httpUrlConnection进行登录后,为了把登录状态同步到webView中,这时需要进行cookie的同步 一.cookie同步方式 下面是登录线程: public class LoginThread extends Thread{ private Handler loginHandler; public LoginThread(Handler loginHandler) { this.loginHandler = loginHandler; } @Override public void run() { List cookieLst = new ArrayList(); HttpParams httpParams = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(httpParams, 5); ConnManagerParams.setTimeout(httpParams, 151000); HttpConnectionParams.setSoTimeout(httpParams, 101000); HttpConnectionParams.setTcpNoDelay(httpParams, true); HttpPost httpPost = new HttpPost(“http://192.168.1.107/cookie/login.php”); List nvPairs = new ArrayList(); nvPairs.add(new BasicNameValuePair(“name”, “lisi”)); nvPairs.add(new BasicNameValuePair(“age”,”22″)); nvPairs.add(new BasicNameValuePair(“gender”, “男”)); ...

2016年10月11日 · 4 分钟 · 天边的星星

史上最详细的Android原生APP中添加ReactNative 进行混合开发教程

背景 React Native出来已经一段时间了,相对来说也算稳定了,在很多的企业中都实际使用他们,混合开发已经是未来的一种趋势,混合开发中使用的技术很多,不外乎Html5、JS框架通过一定的技术和原始交互,目前主流混合开发React Native、Cordova、APICloud、MUI、AppCan、Sencha Touch、jQuery Mobile等等(其他的小伙伴们自己收集),目前网上写教程的人很多,但是React Native更新速度很快,根据他们的教程,中间会遇到各种问题,今天我和大家一起踩踩各种坑,让小伙伴们快速集成到自己的APP中。后续持续更新,反馈发邮件411437734@qq.com共同探讨。 集成步骤 参考官方文档->react native 文档 本文使用开发环境 Android studio 注意最新的React Native支持的最新的SDK为16(android4.1) npm环境,小伙伴们自己安装 nodeJS自己安装,可以参考官方文档安装环境,有问题可以发411437734@qq.com沟通 创建Android项目(已有项目跳过) 打开Android studio 输入项目名称,选择项目目录,点击next 至此项目创建完成(需要注意的是最新的React Native支持最新SDK版本为16 android4.1) React Native集成到上面我们创建的ReactNativeAPPDemo中 参考Facebook react native文档 进入项目根目录,添加JS到项目中-点击Android studio中的Terminal(如下图)  分别执行一下语句 npm init npm install –save react react-native curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig init 主要根据提醒生成package.json文件 curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig 下载.flowconfig文件 参考图片 查看项目中有node_modules,说明react和react native 安装完成 在项目根目录添加.flowconfig 参考下图  也可以手动创建在浏览器打开https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig网址复制内容创建文件 ReactNativeAppDemo配置相关内容 添加"start": “node node_modules/react-native/local-cli/cli.js start” 到package.json 文件下 scripts标签 修改前修改后 添加index.android.js文件到项目中 ...

2016年9月30日 · 2 分钟 · 天边的星星

Android实用工具

Android 命令 ( adb push 文件 目标文件 ) adb shell pm install -r “/data/local/tmp/xxxx” pkg: /data/local/tmp/xxxx 启动指定Activity $ adb shell am start -n “package/package.Activity” -a android.intent.action.MAIN -c android.intent.category.LAUNCHER Android 动态权限 final private int REQUEST_CODE_ASK_PERMISSIONS = 123; private void insertDummyContactWrapper() { int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS); if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) { showMessageOKCancel(“You need to allow access to Contacts”, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_ASK_PERMISSIONS); } }); return; } requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_ASK_PERMISSIONS); return; } insertDummyContact(); } ...

2016年9月27日 · 2 分钟 · 天边的星星

Android 使用Gradle打包APP名称和版本号

需求:我想根据不同的类型,打包不同的版本号,在Android中怎么实现? 例如:release(发布)版本号 1.0.1,debug(测试)版本号1.0.1.20160924 在Android开发中,我们会不断的进行版本打包,打包分为2类: 1、release(正式发布上线版) 2、debug(测试版)。 我们可以通过每次打包前修改build.gradle中android->versionName实现,作为一个程序员,有不断探索的精神,能懒就懒(重复没有意义的工作懒的做)。 知识介绍 1、gradle中定义变量和函数 通过关键字 def 来定义 例如:def versionStr = "1.0.1" def myFunction() { return "xxxxx" } 2、gradle中时间使用 new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"); 这行代码的意思是“当前时间是UTC时区,已yyyyMMdd格式化时间输出” 3、gradle中variant.mergedFlavor使用 variant.mergedFlavor.versionName 表示修改打包时versionName的值 4、gradle中variant.outputs使用 variant.outputs表示输出相关配置 下面是我的build.gradle文件 apply plugin: &#39;com.android.application&#39; apply plugin: &#39;android-apt&#39; //定义时间 def releaseTime() { return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC")) } //设置发布的显示的版本号 def getVersionName(){ return "1.2.0" } android { compileSdkVersion 23 buildToolsVersion "24.0.0" defaultConfig { applicationId "com.xxx.xxxx" minSdkVersion 14 targetSdkVersion 23 versionCode 3 //versionName getVersionName() } buildTypes { debug { buildConfigField("boolean","API_DEBUG","true") minifyEnabled false proguardFiles getDefaultProguardFile(&#39;proguard-android.txt&#39;), &#39;proguard-rules.pro&#39; } release { buildConfigField("boolean","API_DEBUG","false") minifyEnabled false proguardFiles getDefaultProguardFile(&#39;proguard-android.txt&#39;), &#39;proguard-rules.pro&#39; } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } //修改打包不能成功配置 lintOptions { checkReleaseBuilds false abortOnError false } //配置自定义打包名称 applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile def fileName if (outputFile != null && outputFile.name.endsWith(&#39;.apk&#39;)) { if (variant.buildType.name.equals(&#39;release&#39;)) { variant.mergedFlavor.versionName = getVersionName() fileName = "XXXX_<span class="katex math inline">{variant.mergedFlavor.versionName}_release.apk" } else if (variant.buildType.name.equals(&#39;debug&#39;)) { variant.mergedFlavor.versionName = getVersionName()+"."+releaseTime() fileName = "XXXX_</span>{variant.mergedFlavor.versionName}_debug.apk" } output.outputFile = new File(outputFile.parent, fileName) } } } } dependencies { compile fileTree(include: [&#39;*.jar&#39;], dir: &#39;libs&#39;) testCompile &#39;junit:junit:4.12&#39; } tasks.withType(JavaCompile) { options.encoding = "UTF-8" } 大家可以举一反三 例如想修改versionCode可以这么写 variant.mergedFlavor.versionCode = xxxx; 现在试试吧! ...

2016年9月24日 · 1 分钟 · 天边的星星

Android Studio 2.0+发布APK出现ExternalSystemException: String index out of range: -123错误

前阵子Android Studio 2.0正式版发布了,很高兴的就升到了最新版本。 一编译就出现400多个错误提示,Gradle2.0编译速度也让人泪奔,哎,可能是技术太渣不懂那些配置,晚晚加班也没时间学习,还好debug方式编译正常运行 今天老大叫发布APK,使用Android Studio2.0 release APK 时出现ExternalSystemException: String index out of range: -123错误提示, 搞了一个晚上终于解决了,记忆不好,在这里记录一下,怕以后出现类似问题忘记怎么解决。 解决方法: 在主项目build.gradle的android标签里加上 lintOptions { checkReleaseBuilds **false ** *// Or, if you prefer, you can continue to check for errors in release builds, ** // but continue the build even when errors are found: * abortOnError **false **} 如图: ![](http://img.blog.csdn.net/20160423152939548?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 转自:http://blog.csdn.net/jia__/article/details/51226475

2016年9月22日 · 1 分钟 · 天边的星星