AndroidMACTask.java

package com.csdn.android.util;import android.os.AsyncTask;import android.os.AsyncTask.Status;import com.csdn.android.datamanage.module.LicenseCheck;public class AndroidMACTask {private static boolean mInit=false;public static void checkDeviceMac(boolean isOk){if(mInit){return; }mInit=true;//获取失败,则进入子线程重新获取if(!isOk){//初始化Mac地址if(mInitMacTask==null || mInitMacTask.getStatus() == Status.RUNNING ||mInitMacTask.getStatus() == Status.FINISHED){return;}mInitMacTask.execute();}//获取成功,并且从缓存获取else if(AndroidUtil.isReaderMACCache()){//读取设置Mac地址if(mReaderMacFromDeviceTask==null || mReaderMacFromDeviceTask.getStatus() == Status.RUNNING ||mReaderMacFromDeviceTask.getStatus() == Status.FINISHED){return;}mReaderMacFromDeviceTask.execute();}}//读取MAC地址任务private static AsyncTask<Void, Void, Void> mInitMacTask = new AsyncTask<Void, Void, Void>(){@Overrideprotected Void doInBackground(Void... params) {boolean isOk = AndroidUtil.initMACdoInBackground();//假如获取MAC成功,并且设备是通过MAC授权,则重新初始化授权if(isOk && AndroidUtil.isReaderMac()){LicenseCheck.updateCacheState(FrameHelper.getAppContext(), false);}return null;}};//读取MAC地址任务private static AsyncTask<Void, Void, Void> mReaderMacFromDeviceTask = new AsyncTask<Void, Void, Void>(){@Overrideprotected Void doInBackground(Void... params) {String mac = AndroidUtil.getMacFromDeviceInBackground();//假如设备不是通过MAC授权的,则把物理地址放到缓存if(!AndroidUtil.isReaderMac()){AndroidUtil.saveMacInfo(mac);return null;}//MAC缓存地址同物理地址if(AndroidUtil.getMAC().equals(mac)){AndroidUtil.saveMacInfo(mac);return null;}//MAC物理地址不同与缓存地址,重新初始化AndroidUtil.saveMacInfo(mac);LicenseCheck.updateCacheState(FrameHelper.getAppContext(), false);return null;}};}

AndroidUtil.java

package com.csdn.android.util;import com.csdn.android.framework.util.StringUtil;import android.content.Context;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.telephony.TelephonyManager;public class AndroidUtil {//是否允许MAC使用MAC地址private static boolean ALLOW_MAC=true;//唯一标识的长度private static int IDENTIFY_LEN=14;//MAC地址的标识private static String KEY_MAC="android_mac";//初始化IMEIprivate static boolean mIntiIMEI = false;//初始化MACprivate static boolean mInitMAC=false;//IMEI缓存private static String mIMEI;//MAC地址缓存private static String mMAC;//是否读取缓存private static boolean mReaderCache=false;//是否读取的MAC地址public static boolean isReaderMac(){//没有完成if(!isInitCompeleted()){return false;}//不允许MAC地址if(!ALLOW_MAC){return false;}//取IMEI地址if(!StringUtil.isNull(getIMEI())){return false;}//取MAC地址return true;}//判断是否读取缓存public static boolean isReaderMACCache(){return mReaderCache;}//获取IMEI地址private static String getIMEI() {if (mIntiIMEI) {return mIMEI;}TelephonyManager telephonyManager = (TelephonyManager) FrameHelper.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);try {mIMEI = telephonyManager.getDeviceId();} catch (Exception e) {}mIntiIMEI = true;return mIMEI;}//是否初始化完成public static boolean isInitCompeleted(){if(!StringUtil.isNull(getIMEI()) || mInitMAC){return true;}return false;}/** * 获取设备唯一标识,IMEI 或者 MAC * @return */public static String getIdentifyId(){//没有完成if(!isInitCompeleted()){return null;}//不允许MAC地址if(!ALLOW_MAC){return getIMEI();}//取IMEI地址if(!StringUtil.isNull(getIMEI())){return getIMEI();}//取MAC地址return getMAC();}//获取MAC地址public static String getMAC() {if (mInitMAC) {return mMAC;}return null;}//获取真实MAC地址public static String getMACSource() {if (mInitMAC && !StringUtil.isNull(mMAC)) {if(mMAC.length()>12){return mMAC.substring(0, 12);}return mMAC;}return "";}public static boolean initMACInMainThread(){return initMAC(1,true);}public static boolean initMACdoInBackground(){//尝试100次return initMAC(100,false);}//后台获取MAC地址public static String getMacFromDeviceInBackground(){return getMacFromDevice(100);}private static boolean initMAC(int internal,boolean readerCache){String mac = null;//是否读取缓存if(readerCache){//通过缓存获取mac = FrameHelper.readSharedData(FrameHelper.getAppContext(), KEY_MAC);if(!StringUtil.isNull(mac)){mInitMAC = true;mMAC = mac;mReaderCache =true;return true;}}mac = getMacFromDevice(internal);if(!StringUtil.isNull(mac)){saveMacInfo(mac);mReaderCache = false;return true;}return false;}//保存Mac地址public static void saveMacInfo(String mac){mInitMAC = true;mMAC = mac;FrameHelper.saveSharedData(FrameHelper.getAppContext(), KEY_MAC,mMAC);}//尝试读取MAC地址private static String getMacFromDevice(int internal){String mac=null;WifiManager wifiManager = (WifiManager) FrameHelper.getAppContext().getSystemService(Context.WIFI_SERVICE);//尝试获取macmac = tryGetMAC(wifiManager);if(!StringUtil.isNull(mac)){return mac;}//获取失败,尝试打开wifi获取boolean isOkWifi = tryOpenMAC(wifiManager);for(int index=0;index<internal;index++){//如果第一次没有成功,第二次做100毫秒的延迟。if(index!=0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}mac = tryGetMAC(wifiManager);if(!StringUtil.isNull(mac)){break;}}//尝试关闭wifiif(isOkWifi){tryCloseMAC(wifiManager);}return mac;}//尝试打开MACprivate static boolean tryOpenMAC(WifiManager manager){boolean softOpenWifi = false;int state = manager.getWifiState();if (state != WifiManager.WIFI_STATE_ENABLED && state != WifiManager.WIFI_STATE_ENABLING) {manager.setWifiEnabled(true);softOpenWifi = true;}return softOpenWifi;}//尝试关闭MACprivate static void tryCloseMAC(WifiManager manager){manager.setWifiEnabled(false);}//尝试获取MAC地址private static String tryGetMAC(WifiManager manager){WifiInfo wifiInfo = manager.getConnectionInfo();if (wifiInfo == null || StringUtil.isNull(wifiInfo.getMacAddress())) {return null;}String mac = wifiInfo.getMacAddress().replaceAll(":", "").trim().toUpperCase();mac = formatIdentify(mac);return mac;}//格式化唯一标识private static String formatIdentify(String identify){//判空if(StringUtil.isNull(identify)){return identify;}//去除空格identify = identify.trim();//求长度int len = identify.length();//正好if(len== IDENTIFY_LEN){return identify;}//过长,截取if(len>IDENTIFY_LEN){return identify.substring(0, IDENTIFY_LEN);}//过短,补0for(;len<IDENTIFY_LEN;len++){identify += "0";}//大于默认return identify;}}



更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. android URL获取图片显示到ImageView 控件上
  3. android 获取屏幕的方向
  4. Android(安卓)vlc 简单使用
  5. android 获取wifi 信号质量
  6. 又一处疑难杂症的折腾笔记:Android内嵌html5获取定位信息
  7. 【Android(安卓)内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 |
  8. Android从Uri获取视频图片的真实地址
  9. Android(安卓)拍照获取不压缩原图方式以及存在的问题

随机推荐

  1. Android 创建android Splash界面以及避免
  2. android:theme="@android:style/Theme.Li
  3. Android View添加 Listener 小技巧示例
  4. Flutter 与 Android
  5. Android Jni示例
  6. Android studio 连接数据库小经历遇到的
  7. Android studio添加第三方类库时出现的版
  8. android编译错误,Android requires compil
  9. 安卓开发38:安卓的滚动条相关属性
  10. RelativeLayout的16种特有属性