首先要说一下使用Android studio的时候的几个配置

config in 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的说法是这样的

wifi change in M

你只能修改你自己的应用创建的wifiConfiguration,不能修改或者删除有系统创建的wifiConfiguration。(也就是如果是由用户在“设置”里面手动配置的wifiConfiguration,那么其他app不能修改或删除它。)

在6.0以前,调用enableNetwork()接口的时候,第二个三处disableAllOthers=true会断开流量,如果你的应用targetSdkVersion是20及以下,那么以后有网络请求就都会走wifi。如果targetSdkVersion是21或更高,调用相关接口才能使网络请求绑定到指定网络。,

Android M上访问硬件信息

access to hardvare identifier

WifiInfo.getMacAddress()BluetoothAdapter.getAddress()这两个接口分别用于获取wifi的mac地址和蓝牙地址,但是在6.0上他们都返回一个恒定的值02:00:00:00:00:00

WifiManager.getScanResults()用来获取扫描列表,但是如果targetSdkVersion是23,那么返回的是空。当targetSdkVersion时22及以下的时候,才不为空。

旧的APP要兼容6.0怎么办

首先当前要声明相关权限。以前是悄悄使用addNetwork和enableNetwork就直接悄悄把wifi给切换了。在6.0上,可以先判断以下是不是有相关配置,如果有,那么可以让用户先去“忘记网络”,如果没有,那么就可以悄悄使用addNetwork和enableNetwork。

另,如果你的网络配置里的密码输入错误,那么addNetwork的时候就会返回-1。

addNetowrk default disable
注意,addNetwork默认把参数网络认为是disable,如果想要连接它,还需要调用enableNetwork。

参考

1.如何选择compileSdkVersion,minSdkVersion和targetSdkVersion

2.Android M新的运行时权限