HttpClient 和 HttpURLConnection

现在已经不推荐使用HttpClient了,从Android Level 23(Android 6.0)开始,已经强制使用HttpURLConnection了,著名的第三方库AsynHttpClient用的就是HttpClient,虽然提供了一个可以在6.0上使用HttpClient的包,但是已经不再维护了。 现在大家用的比较多的就是Okhttp、Volley、Retrofit,选择哪个全看你自己的需求,但是我理解都是需要再封装一下才能比较方便地使用。 下面说一下HttpURLConnection吧 所有的网络请求,是不允许在主线程中的,因为可能会阻塞主线程,造成ANR,所以网络请求都要这样使用: new Thread(new Runnable(){ //具体的http请求代码 }); setRequestMethod设置请求方式GET或POST setConnectTimeout设置连接建立的超时时间 setReadTimeout设置请求的超时时间 setDoOutput默认为false,设置是否向HttpURLConnection输出 setDoInput默认为true,设置是否从HttpURLConnection读入 setRequestProperty设置请求头 下面是示例 URL url = new URL(urlString); //通过调用URL对象openConnection()方法来创建URLConnection对象 HttpURLConnection connection = (HttpURLConnection) url.openConnection(…

Android二维码扫描库

之前在github上找了一个对zxing简化过的二维码扫描库,运行它的demo的时候挺好,放到我自己的工程里面就各种不对劲,比如说扫描效率很差、角度刁钻等。当时也没多想,换了另外一个zbar库还是这样!!!好吧,问题出在我自己的代码里面。 花点儿时间看了源码,原来问题是这样出现的: Demo里的扫描界面 demo里的扫描界面是如下图这样的,有系统的状态栏,然后中间是一个方形的扫描区域。 我工程里的扫描界面 我把库拿来用的时候,对扫描界面进行了改动,加上了标题栏,而且使用的是Linearlayout 致使扫描框往下了一点,移动的高度也就是标题栏的高度。我就猜会不会是这个问题,找到源码来看一看 果然!计算截图区域的时候,左上角顶点的Y坐标是int y = cropTop * cameraHeight / containerHeight;再看一下里面用到的cropTop是什么,是int cropTop = location[1] - getStatusBarHeight(),是减去了状态栏高度之后的位置。 所以,我的布局里面还有一个标题栏,造成了截取区域有误差,类似下图,扫描效率就很差了。 截取的二维码不全,所以给人感觉二维码扫描效率不高。。。😭…

Android 6.0 上的wifi问题

首先要说一下使用Android studio的时候的几个配置 compileSdkVersion告诉Gradle用哪个Android SDK版本编译你的应用。使用任何新添加的API就需要使用对应level的android SDK。 compileSdkVersion不会改变运行时的行为,最好是使用最新的SDK进行编译,这样可以避免使用启用的API,并且为使用新的API做好准备。 minSdkVersion即应用可以运行额最低要求。 targetSdkVersion它是android提供向前兼容的主要依据,如果目标设备的API版本正好等于此数值,他会告诉Android平台:此程序在此版本已经经过充分测,没有问题。不必为此程序开启兼容性检查判断的工作了。targetSdkVersion是在程序运行时起作用。 Android M上wifi相关的问题 以前只在安装的时候有权限的声明,用户不同意的话就不能安装。在6.0上有了新的权限系统,你可以在安装之后再去关闭它。 看一下官方文档,里面对于wifi的说法是这样的 你只能修改你自己的应用创建的wifiConfiguration,不能修改或者删除有系统创建的wifiConfiguration。(也就是如果是由用户在“设置”里面手动配置的wifiConfiguration,那么其他app不能修改或删除它。) 在6.0以前,调用enableNetwork()接口的时候,第二个三处disableAllOthers=true会断开流量,如果你的应用targetSdkVersion是20及以下,那么以后有网络请求就都会走wifi。如果targetSdkVersion是21或更高,调用相关接口才能使网络请求绑定到指定网络。, Android M上访问硬件信息 WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()这两个接口分别用于获取wifi的mac地址和蓝牙地址,…

Android 圆角按钮

为了好看,经常需要把按钮变成圆角,在Android里面,可以使用如下方式来实现圆角. 之前的一篇博客写了怎样实现按钮的点击效果,这次的原理差不多。 步骤一: 在drawable里面新建一个shape_login_bt.xml 里面的内容如下 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_enabled="true"> <shape android:…

Button in Android L

在android L及以上,使用button的时候,差点掉进一个坑里。 起因: 想要点击图片之后执行相应的操作,就类似于点击了按钮一样。 做法: 在布局文件里面定义一个FrameLayout,然后底层是Button,上面是ImageView,这两个的大小都match_parent。这样很简单就能够实现点击了图片就类似于点击了按钮一样可以执行某些操作。 问题: 在android 4.x及以下都没有问题,但是android 5.x就出问题了。问题表现为图片不显示!!!!,但该块区域能点,并且能正确执行某些操作。 只是图片不显示,这可愁死我了!::>_<:: 定位问题的过程: 1.先去google以下有没有人也遇到类似的问题,发现这位同学也遇到了这个问题,而且他的博客还标注了【原创】,感觉屌屌的👍 2.还发现stackoverflow上这哥们儿也遇到。难道真是android的bug? 细想不对啊!5.x都出来这么长时间了,如果有这么个bug,难道大家不应该喜极而泣、奔走相告!? stackoverflow上有个回答,指明了方向 原来是evelation捣的鬼! 也怪我!我把button的背景设置为透明,这给定位问题造成了比较大的困难,…

Android按钮点击效果

Android按钮点击效果 例如一个登录按钮,我希望它平常是浅蓝色的,但按下之后是深蓝色的 <Button android:layout_height="50dp" android:layout_width="match_parent" android:text="@string/login_logBTStr" android:textSize="18sp" android:onClick="logIn" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_…

如何在android里面支持portal wifi

之前写过在Android上判断是否有可用的网络(流量或者wifi),这基本上都够用了。但是有一种portal wifi,虽然判定是可用的,且ping也是能ping通的,但是就是上不了网,因为wifi需要输入动态验证码。在火车站、汽车站、商场之类的地方,portal wifi比较常见。 如果app里面需要处理这种情况,那么可以根据网络请求的返回值来判断,基本上statusCode是300+的都是重定向,一般是重定向到portal wifi的获取验证码页面。 private void isWifiSetPortal() { // 商定的请求链接 final String mWalledGardenUrl = "xxxx"; // 设置请求超时 final int WALLED_GARDEN_SOCKET_TIMEOUT_MS = 10000; HttpURLConnection urlConnection = null; try { URL url = new URL(mWalledGardenUrl); urlConnection = (HttpURLConnection)…

Android判断网络是否可用

Android里面有ConnectivityManager可以判断当前的网络状态。 判断是否有可用的网络 如果你只是想判断当前是不是有可用的网络(不在乎wifi或者流量的话),可以使用如下代码 /** * 是否已经连接网络(外网不一定通) * @return */ public boolean isNetConnected() { if (connectivityManager != null){ Log.d(LOGLABEL, "connectivitymanager is not null"); //获取代表联网对象的NetworkInfo对象 NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()){ Log.d(LOGLABEL , "activityNetworkInfo is not null and isconnected"); if (networkInfo.getType() == ConnectivityManager.…