Android:获取MAC < 安卓系统11 <= 获取UUID

2023-09-14 09:56:52

1.核心代码 

主要的UseMac.java

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Environment;
import android.util.Log;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

public class UseMac {

    public static final String main(Context context) {
        //R对应安卓11  -->30
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            //这里做你想做的事
            String uuid = "";
            try {
                uuid = readKey();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return uuid;
        }else {
            return TVMac(context);
       }
    }



    private static String TVMac(Context context){
        int networkType;
        final ConnectivityManager connectivityManager= (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
        @SuppressLint("MissingPermission") final NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
        networkType=networkInfo.getType();
        Log.d("获取当前数据", "network type:"+networkType);
        if(networkType == ConnectivityManager.TYPE_WIFI){
            return getMac_wlan0();
        }else if((networkType == ConnectivityManager.TYPE_ETHERNET)){
            return getMac_eth0();
        }else{
            return getMac_wlan0();
        }
    }


    //====11-----G
        public static String Android11Mac(Context context){
        // 使用WifiManager获取Mac地址
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = null;
        if (wifiManager != null) {
            wifiInfo = wifiManager.getConnectionInfo();
        }

        // 获取Mac地址
        String macAddress = null;
        if (wifiInfo != null) {
            macAddress = wifiInfo.getMacAddress();
            Log.e("macAddress","====>>"+macAddress);
        }


        return macAddress;
    }


    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }



    private static String uuidfileName = "myuuid.txt";
    public static void saveBitmap() throws IOException {
        // 创建目录
        //获取内部存储状态
        String state = Environment.getExternalStorageState();
        //如果状态不是mounted,无法读写
        if (!state.equals(Environment.MEDIA_MOUNTED)) {
            return;
        }
        String sdCardDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        File appDir = new File(sdCardDir, "CaChe");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = uuidfileName;//这里是创建一个TXT文件保存我们的UUID
        File file = new File(appDir, fileName);
        if (!file.exists()) {
            file.createNewFile();
        }
        //保存android唯一表示符
        try {
            FileWriter fw = new FileWriter(file);
            fw.write(getUUID());
            fw.flush();
            fw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }





    public static String readKey() throws IOException {
        // 创建目录
        //获取内部存储状态
        String state = Environment.getExternalStorageState();
        //如果状态不是mounted,无法读写
        if (!state.equals(Environment.MEDIA_MOUNTED)) {
            return null;
        }
        String sdCardDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        File appDir = new File(sdCardDir, "CaChe");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = uuidfileName;//这里是进行读取我们保存文件的名称
        File file = new File(appDir, fileName);
        if (!file.exists()) {
            file.createNewFile();
        }
        BufferedReader reader = null;
        StringBuilder content=null;
        try {
            FileReader fr = new FileReader(file);
            content= new StringBuilder();
            reader = new BufferedReader(fr);
            String line;
            while ((line= reader.readLine())!=null){
                content.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (reader!=null){
                try {
                    reader.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }






    public static final String getNetName(Context context) {
        int networkType;
        final ConnectivityManager connectivityManager= (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
        @SuppressLint("MissingPermission") final NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
        networkType=networkInfo.getType();
        Log.d("获取当前数据", "network type:"+networkType);
        if(networkType == ConnectivityManager.TYPE_WIFI){
            return "WIFI";
        }else if((networkType == ConnectivityManager.TYPE_ETHERNET)){
            return "有线";
        }else{
            return "WIFI";
        }
    }

    //获取无线mac地址
    public static final String getMac_wlan0() {
        try {
            List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface nif : all) {
                if (!"wlan0".equalsIgnoreCase(nif.getName())) {
                    continue;
                }
                byte[] macBytes = nif.getHardwareAddress();
                if (macBytes == null || macBytes.length == 0) {
                    continue;
                }
                StringBuilder result = new StringBuilder();
                for (byte b : macBytes) {
                    result.append(String.format("%02X", b));
                }

                String s1 = result.toString().toUpperCase().replaceAll ("(.{2})", "$1:");//加入:

                return s1.substring(0,s1.length()-1);
            }
        } catch (Exception x) {
            x.printStackTrace();
        }
        return "";
    }

    //获取有线mac地址
    public static String getMac_eth0() {
        try {
            List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface nif : all) {
                if (!"eth0".equalsIgnoreCase(nif.getName())) {
                    continue;
                }
                byte[] macBytes = nif.getHardwareAddress();
                if (macBytes == null || macBytes.length == 0) {
                    continue;
                }
                StringBuilder result = new StringBuilder();
                for (byte b : macBytes) {
                    result.append(String.format("%02X", b));
                }
                String s1 = result.toString().toUpperCase().replaceAll ("(.{2})", "$1:");//加入:
                return s1.substring(0,s1.length()-1);
            }
        } catch (Exception x) {
            x.printStackTrace();
        }
        return "";
    }


}

下面说一下使用

2.获取mac

2.1.修改

主要是在 下面这个方法注释掉的是获取mac的,适合安卓11以下

    public static final String main(Context context) {
        return TVMac(context);
    }
2.2.使用

把main方法的uuid部分注释掉

UseMac.main(activity)

3.获取uuid

这边有一个类,会主动给你申请权限

import android.app.Activity;
import android.content.pm.PackageManager;
import android.util.Log;

import androidx.core.app.ActivityCompat;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

public class FileOper {

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"};
    private Activity activity;
    public FileOper(Activity activity) {
        this.activity =activity;
        try {
            //检测是否有写的权限
            int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE");
            if (permission != PackageManager.PERMISSION_GRANTED) {
                // 没有写的权限,去申请写的权限,会弹出对话框
                ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //flie:要删除的文件夹的所在位置
    public void deleteFile(File file) {
        Log.e("TestFile","清除一下视频缓存");
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                File f = files[i];
                deleteFile(f);
            }
            // file.delete();//如要保留文件夹,只删除文件,请注释这行
        } else if (file.exists()) {
            file.delete();
        }
    }


    public void writeData(String url, String name, String content) {
        String filePath = url;
        String fileName = name + ".txt";
        writeTxtToFile(content, filePath, fileName);
    }

    // 将字符串写入到文本文件中
    private void writeTxtToFile(String strcontent, String filePath, String fileName) {
        //生成文件夹之后,再生成文件,不然会出错
        makeFilePath(filePath, fileName);

        String strFilePath = filePath + fileName;
        // 每次写入时,都换行写
        String strContent = strcontent + "\r\n";
        try {
            File file = new File(strFilePath);
            if (!file.exists()) {
                Log.d("TestFile", "Create the file:" + strFilePath);
                file.getParentFile().mkdirs();
                file.createNewFile();
            }
            RandomAccessFile raf = new RandomAccessFile(file, "rwd");
            raf.seek(file.length());
            raf.write(strContent.getBytes());
            raf.close();
        } catch (Exception e) {
            Log.e("TestFile", "Error on write File:" + e);
        }
    }

    //生成文件
    private File makeFilePath(String filePath, String fileName) {
        File file = null;
        makeRootDirectory(filePath);
        try {
            file = new File(filePath + fileName);
            if (!file.exists()) {
                file.createNewFile();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }


    //判断文件是否存在
    public boolean fileIsExists(String strFile) {
        try {
            File f = new File(strFile);
            if (!f.exists()) {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }


    //生成文件夹
    public void makeRootDirectory(String filePath) {
        File file = null;
        try {
            file = new File(filePath);
            //不存在就新建
            if (!file.exists()) {
                file.mkdir();
            }
        } catch (Exception e) {
            Log.i("error:", e + "");
        }
    }

    //删除指定路径的文件
    public boolean deleteSingleFile(String filePath$Name) {
        File file = new File(filePath$Name);
        // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                Log.e("--Method--", "删除文件" + filePath$Name + "成功!");
                return true;
            } else {
                Log.e("--Method--", "删除文件" + filePath$Name + "失败!");
                return false;
            }
        } else {
            Log.e("--Method--", "文件" + filePath$Name + "不存在!");
            return true;
        }
    }

    /**
     * 读取本地文件
     */
    public String readRate(String path) {

        StringBuilder stringBuilder = new StringBuilder();
        File file = new File(path);
        if (!file.exists()) {
            return "";
        }
        if (file.isDirectory()) {
            Log.e("TestFile", "The File doesn't not exist.");
            return "";
        } else {
            try {
                InputStream instream = new FileInputStream(file);
                if (instream != null) {
                    InputStreamReader inputreader = new InputStreamReader(instream);
                    BufferedReader buffreader = new BufferedReader(inputreader);
                    String line;
                    while ((line = buffreader.readLine()) != null) {
                        stringBuilder.append(line);
                    }
                    instream.close();
                }
            } catch (java.io.FileNotFoundException e) {
                Log.e("TestFile", "The File doesn't not exist.");
                return "";
            } catch (IOException e) {
                Log.e("TestFile", e.getMessage());
                return "";
            }
        }
        return stringBuilder.toString();//对读到的设备ID解密
    }
}
        //读取uuid
        fileOper = new FileOper(this);
        try {
            if(fileOper.fileIsExists(Environment.getExternalStorageDirectory().getAbsolutePath()+uuidfileName)){
                UseMac.saveBitmap();
            }
        }catch(Exception e){
            System.out.println("base64Code:::"+e.toString());//出现异常的处理
        }
3.1.修改
    public static final String main(Context context) {

       //return TVMac(context);
        String uuid = "";
        try {
            uuid = readKey();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return uuid;
    }
更多推荐

MySQL与Oracle的分页

MySQL与Oracle的分页当我们通过SQL去查询一个结果集的时候,并不需要查看所有行,可能只是查看前几行,或者中间的几行。则需要像MySQL的limit或Oracle的ROWNUM与FETCHNEXT来实现。MySQL语法SELECT*FROMtable_nameLIMIT[offset,]row_count;LI

oracle中的minus数据比对

1、要有唯一索引或者主键作为前提,减少数据冲突的数量。2、当有in查询的时候,尽量用exists,这样能提高查询效率:createtableTF_F_USER_DIFF1tablespaceBD_TBS_EXP_DATAparallel20asselect/*+parallel(c,20)/*fromTF_F_USER

PostgreSQL 数据备份&恢复

文章目录PostgreSQL备份方式SQL备份(逻辑备份)文件系统备份(物理备份)归档备份(物理备份)逻辑备份&恢复物理备份&恢复(全量)备份恢复物理备份&恢复(某个时间点)场景具体操作PostgreSQL备份方式防止数据丢失的第一道防线就是备份。数据丢失有的是硬件损坏,还有人为的误删之类的,也有BUG的原因导致误删数

宝塔面板日志和缓存占用磁盘空间很大,如何清理?

服务器使用的宝塔面板,最近发现服务器的“系统盘”快爆满了,点面板上日志管理都要收费,我也不是很懂服务器的运维,使用ai进行询问,得到了解决:/var/log日志目录运行下面的命令查找是哪些目录占用空间很大du-h--max-depth=1我这边是/var/log和var/cache两个目录占用空间很大,进入/var/l

网络安全(黑客)自学

前言我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,一

对象的创建过程

对象的创建过程基于两个方面回答这个问题:①jvm加载和分配内存。②java对象初始化。1.在实例化一个对象的时候,JVM首先会去检查目标对象是否已经被加载并初始化了。2.如果没有,JVM需要立刻去加载目标类,然后调用目标类的构造器完成初始化。①目标类的加载是通过类加载器来实现的,主要就是把一个类加载到内存里。②然后初始

PyQt学习笔记-使用QSettings保存系统配置参数

目录1.QSettings简介2.初始化QSettings及数据存储位置2.1使用系统api存储2.2存储成配置文件2.2.1使用文件格式设置2.2.2Format格式说明3Qsettings的使用3.1QSettings的数据保存和读取3.1.1使用setValue方法保存数据3.1.2使用value方法获取配置文件

flutter聊天界面-TextField输入框实现@功能等匹配正则表达式展示高亮功能

flutter聊天界面-TextField输入框实现@功能等匹配正则表达式展示高亮功能一、简要描述描述:最近有位朋友讨论的时候,提到了输入框的高亮展示。在flutterTextField中需要插入特殊样式的标签,比如:“请@张三回答一下”,这一串字符在TextField中输入,当输入@时弹出好友列表选择,然后将“@张三

棒球游戏代码编写·棒球1号位

棒球代码编写1.棒球游戏的代码结构介绍棒球游戏的整体代码结构棒球游戏的整体代码结构可以按照以下几个模块进行划分:游戏引擎:游戏引擎是整个游戏的核心,负责管理游戏的各个系统,包括图形渲染、物理模拟、声音播放等。棒球游戏的引擎需要支持场景切换、角色动画、特效渲染等功能。角色系统:角色系统负责管理游戏中的角色,包括球员、裁判

Unity 课时 4 : No.4 模拟面试题

课时4:No.4模拟面试题C#1.请说明字符串中stringstr=nullstringstr=“”stringstr=string.Empty三者的区别第一个未作初始化没有值,第二个为空字符串,答案:str=null在堆中没有分配内存地址str=""和string.Empty一样都是在堆内存中分配了空间,里面存储的是

数据优化与可视化:3D开发工具HOOPS在BIM模型轻量化中的作用分析

在建筑和工程领域,BIM(建筑信息建模)是一种重要的数字化工具,但大型BIM模型往往需要大量的计算资源和存储空间。为了解决这一问题,HOOPS技术成为了一种关键工具,可以帮助实现BIM模型轻量化,提高性能、减小资源占用,从而加速项目进展。本文将探讨HOOPS如何帮助BIM模型实现轻量化的方式以及其在建筑和工程领域的重要

热文推荐