Android笔记

Stella981
• 阅读 676

    首先是权限,因为WIFI也是可以用于定位的,只是精度没那么高而已,所以6.0之后的权限系统对WIFI的权限进行了限制,除了需要日常的WIFI操作权限之外,还需要定位权限,否则会获取不到WIFI的信息。

    <!--完全的网络访问权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 以下是使用wifi访问网络所需的权限 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--定位权限-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

    大体步骤,就是:

        1、显示列表(已连接、已保存的、已保存但没信号的等等,需要根据不同的状态区别显示并排序)

        2、判定是否已经保存,如果保存了直接连接

        3、没保存,提示输入密码,没有密码就跳过

        4、代码自动将需要连接的WIFI以及密码,写入系统保存中,写了之后再进行连接

    其他需要注意:保存了的忘了有可能也需要修改密码,SSID不能用作唯一码,因为WIFI名称是有可能是一样的。

    下面是工具类代码:

package com.imxiaoyu.common.utils;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.TextUtils;

import com.imxiaoyu.common.base.helper.BaseHelper;

import java.util.List;

/**
 * WIFI连接工具类
 * Created by 庞光渝 on 2017/3/1.
 */

public class WifiUtils extends BaseHelper {

    private WifiManager wifiManager;

    public WifiUtils(Activity activity) {
        super(activity);
        wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
        doStartScan();
    }

    /**
     * 扫码、刷新WIFI
     */
    public void doStartScan() {
        wifiManager.startScan();
    }


    /**
     * 是否已经开启了WIFI
     * @return
     */
    public boolean isWifiOpen(){
        if(wifiManager==null){
            return false;
        }
       return wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED;
    }

    /**
     * 开、关 WIFI
     *
     * @param bln
     */
    public void doSwitchWifi(boolean bln) {
        if (wifiManager != null) {
            wifiManager.setWifiEnabled(bln);
        }
    }

    /**
     * 返回WIFI列表,并按信号强度排序
     *
     * @return
     */
    public List<ScanResult> getScanResults() {
        return ascWifiLevel(wifiManager.getScanResults());//得到扫描结果
    }

    /**
     * 断开网络
     */
    public void disableNetwork(int wifiId){
        wifiManager.disableNetwork(wifiId);
    }

    /**
     * 不保存网络
     * @param wifiId
     */
    public void removeNetwork(int wifiId){
        wifiManager.removeNetwork(wifiId);
    }

    /**
     * 不保存网络
     * @param SSID
     */
    public void removeNetwork(String SSID){
        removeNetwork(isConfiguration(SSID));
    }

    /**
     * 返回当前正在连接的WIFI的信息(正在连接,也包括没连接上或者密码错误状态,相当于是一个占位的状态)
     * @return
     */
    public WifiInfo getWifiInfo(){
        return wifiManager.getConnectionInfo();
    }

    /**
     * 得到配置好的(即已经保存了密码的)WIFI的信息
     */
    public List<WifiConfiguration> getConfiguration() {
        return wifiManager.getConfiguredNetworks();
    }

    /**
     * 判定指定的WIFI已经配置好,然后根据WIFI的地址bssid返回NETId;
     *
     * @param SSID WifiConfiguration这个列表的SSID是前后带有双引号的,传进来的时候一定要注意
     * @return
     */
    public int isConfiguration(String SSID) {
        List<WifiConfiguration> wifiConfigurations = getConfiguration();
        if(wifiConfigurations!=null) {
            for (int i = 0; i < wifiConfigurations.size(); i++) {
                if (wifiConfigurations.get(i).SSID.equals(SSID)) {//地址相同
                    return wifiConfigurations.get(i).networkId;
                }
            }
        }
        return -1;
    }
    /**
     * 判定指定的WIFI已经配置好,然后根据WIFI的地址bssid返回NETId;
     *
     * @param BSSID WifiConfiguration这个列表的SSID是前后带有双引号的,传进来的时候一定要注意
     * @return
     */
    public int isConfigurationBSSID(String BSSID) {
        List<WifiConfiguration> wifiConfigurations = getConfiguration();
        if(wifiConfigurations!=null) {
            for (int i = 0; i < wifiConfigurations.size(); i++) {
                if (wifiConfigurations.get(i).BSSID!=null&&wifiConfigurations.get(i).BSSID.equals(BSSID)) {//地址相同
                    return wifiConfigurations.get(i).networkId;
                }
            }
        }
        return -1;
    }

    /**
     * 添加指定WIFI的配置信息,原列表不存在此SSID
     *
     * @param wifiList
     * @param ssid
     * @param pwd
     * @return
     */
    public int addWifiConfig(List<ScanResult> wifiList, String ssid, String pwd) {
        int wifiId = -1;
        for (int i = 0; i < wifiList.size(); i++) {
            ScanResult wifi = wifiList.get(i);
            if (wifi.SSID.equals(ssid)) {
                WifiConfiguration wifiCong = new WifiConfiguration();
                wifiCong.SSID = "\"" + wifi.SSID + "\"";//\"转义字符,代表"
                wifiCong.preSharedKey = "\"" + pwd + "\"";//WPA-PSK密码
                wifiCong.hiddenSSID = false;
                wifiCong.status = WifiConfiguration.Status.ENABLED;
                wifiId = wifiManager.addNetwork(wifiCong);//将配置好的特定WIFI密码信息添加,添加完成后默认是不激活状态,成功返回ID,否则为-1
                if (wifiId != -1) {
                    return wifiId;
                }
            }
        }
        return wifiId;
    }

    /**
     * 连接指定的WIFI
     *
     * @param wifiId
     * @return
     */
    public boolean doConnectWifi(int wifiId) {
        List<WifiConfiguration> wifiConfigurations = getConfiguration();
        for (int i = 0; i < wifiConfigurations.size(); i++) {
            WifiConfiguration wifi = wifiConfigurations.get(i);
            if (wifi.networkId == wifiId) {
                while (!(wifiManager.enableNetwork(wifiId, true))) {//激活该Id,建立连接
                    //status:0--已经连接,1--不可连接,2--可以连接
                    ALog.e("ConnectWifi", String.valueOf(wifiConfigurations.get(wifiId).status));
                }
                return true;
            }
        }
        return false;
    }

    /**
     * 取消保存
     *
     * @param networkID
     */
    public void removeNetword(int networkID) {
        wifiManager.removeNetwork(networkID);
        wifiManager.saveConfiguration();
    }

    /**
     * 排序一下信号强度
     *
     * @param list
     * @return
     */
    public static List<ScanResult> ascWifiLevel(List<ScanResult> list) {
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size() - 1; j++) {
                if (list.get(j).level < list.get(j + 1).level) {
                    ScanResult scanResult = list.get(j);
                    list.set(j, list.get(j + 1));
                    list.set(j + 1, scanResult);
                }
            }
        }
        return list;
    }

    /**
     * 返回一个WIFI的加密方式
     *
     * @param ssid
     * @return
     */
    public String getCipherType(String ssid) {
        WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);

        List<ScanResult> list = wifiManager.getScanResults();

        for (ScanResult scResult : list) {
            if (!TextUtils.isEmpty(scResult.SSID) && scResult.SSID.equals(ssid)) {
                String capabilities = scResult.capabilities;
                if (!TextUtils.isEmpty(capabilities)) {

                    if (capabilities.contains("WPA") || capabilities.contains("wpa")) {
                        return "WAP";

                    } else if (capabilities.contains("WEP") || capabilities.contains("wep")) {
                        return "WEP";
                    } else {
                        return null;
                    }
                }
            }
        }
        return null;
    }
}

参考博客:

http://blog.csdn.net/caoliang0921/article/details/8799530
http://www.soso.io/article/100080.html
http://blog.csdn.net/u014774589/article/details/48950727
点赞
收藏
评论区
推荐文章
胖大海 胖大海
1年前
Linux 文件权限
权限管理:指的是操作文件权限超管(root)用户不受普通权限的限制。文件权限分类写内容的权限可写r4写内容的权限可写w2执行的权限可执行x1权限位的概念rw  rw   rw 属主 属组  其他人设置权限的命令格式chown\ 大家缺乏机器练手的话,可以去3A服务器看看!
Wesley13 Wesley13
2年前
android获取mac地址
1、<usespermissionandroid:name"android.permission.ACCESS_WIFI_STATE"/ 2、privateStringgetLocalMacAddress(){WifiManagerwifi(WifiManager)getSystemSe
Wesley13 Wesley13
2年前
java用户角色权限设计
实现业务系统中的用户权限管理B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。因此B/S业务系统都需要有
Stella981 Stella981
2年前
Android 设置系统闹铃和日历
一、创建定时器 设置权限<usespermissionandroid:name"com.android.alarm.permission.SET_ALARM"/案例https://developer.android.com/reference/android/provider/Alar
Stella981 Stella981
2年前
PHP Laravel5实现的RBAC权限管理操作示例
根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,可以根据菜单的例子,请自行完善,开发。下面请认真学习一下laravel的RBAC设计1、建表(用户表、角色表、权限表、用户角色表、角色权限表)1CREATETABLEIFNOTEXISTSmr_role2(3id
Wesley13 Wesley13
2年前
Linux中的特殊权限
Linux中除了普通权限之外,还有三个特殊权限。      SUID::以文件的所属用户执行,而非执行文件的用户,多用于可执行文件,设置suid后,在权限位中,所属用户的最后一个权限为变为s,添加SUID权限可用“s”表示。    例如:passwdadam@ultraera ~$ which passwd/usr/b
Stella981 Stella981
2年前
Android版添加phonegap
1.下载插件包。2\.解压所下载的包,从lib目录中得到所需要的所有的库:BaiduSocialShareSDKAndroid2.0.0.jar3\.修改AndroidManifest.xml,增加以下权限:<usespermissionandroid:name"android.permiss
Wesley13 Wesley13
2年前
oracle用户权限管理
oralce对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权1.查看当前数据库所有用户:select\fromall\_users;2.查看表所支持的权限:select\fromuser\_tab\_privs;3.把表的权限赋予用户:  grantselect,insert,updateon
Easter79 Easter79
2年前
Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构
框架简介主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具组件、视图操作组件、工作流组件组件、代码生成等。采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。平台简介    是一个分布式的框架,提供项目模块化、服务化、热插拔的思想,高
Stella981 Stella981
2年前
Android加载网络图片
AndroidManifest.xml文件中加入以下权限设置:    <usespermissionandroid:name"android.permission.INTERNET"/    <usespermissionandroid:name"android.permission.WRITE\_EXTERNAL\_STORAGE