美文网首页
Android功能记录(一) ------ 获取手机唯一标识码

Android功能记录(一) ------ 获取手机唯一标识码

作者: 千喜Ya | 来源:发表于2019-05-30 15:44 被阅读0次

    6.29增加漏掉的依赖文件 :

    import android.text.TextUtils;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    public class FileUtils {
    
        public final static String FILE_EXTENSION_SEPARATOR = ".";
    
        private FileUtils() {
            throw new AssertionError();
        }
    
        /**
         * read file
         *
         * @param filePath
         * @return if file not exist, return null, else return content of file
         * @throws RuntimeException if an error occurs while operator BufferedReader
         */
        public static String readFile(String filePath) {
            String fileContent = "";
            File file = new File(filePath);
            if (!file.isFile()) {
                return null;
            }
    
            BufferedReader reader = null;
            try {
                InputStreamReader is = new InputStreamReader(new FileInputStream(file));
                reader = new BufferedReader(is);
                String line;
                while ((line = reader.readLine()) != null) {
                    fileContent += line + " ";
                }
                reader.close();
                return fileContent;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return fileContent;
        }
    
        /**
         * write file
         *
         * @param filePath
         * @param content
         * @param append   is append, if true, write to the end of file, else clear content of file and write into it
         * @return return false if content is empty, true otherwise
         * @throws RuntimeException if an error occurs while operator FileWriter
         */
        public static boolean writeFile(String filePath, String content, boolean append) {
            if (filePath == null || filePath.length() == 0) {
                return false;
            }
    
            FileWriter fileWriter = null;
            try {
                makeDirs(filePath);
                fileWriter = new FileWriter(filePath, append);
                fileWriter.write(content);
                fileWriter.close();
                return true;
            } catch (IOException e) {
                throw new RuntimeException("IOException occurred. ", e);
            } finally {
                if (fileWriter != null) {
                    try {
                        fileWriter.close();
                    } catch (IOException e) {
                        throw new RuntimeException("IOException occurred. ", e);
                    }
                }
            }
        }
    
        /**
         * write file
         *
         * @param filePath
         * @param contentList
         * @param append      is append, if true, write to the end of file, else clear content of file and write into it
         * @return return false if contentList is empty, true otherwise
         * @throws RuntimeException if an error occurs while operator FileWriter
         */
        public static boolean writeFile(String filePath, List<String> contentList, boolean append) {
            if (contentList == null || contentList.size() == 0) {
                return false;
            }
    
            FileWriter fileWriter = null;
            try {
                makeDirs(filePath);
                fileWriter = new FileWriter(filePath, append);
                int i = 0;
                for (String line : contentList) {
                    if (i++ > 0) {
                        fileWriter.write("\r\n");
                    }
                    fileWriter.write(line);
                }
                fileWriter.close();
                return true;
            } catch (IOException e) {
                throw new RuntimeException("IOException occurred. ", e);
            } finally {
                if (fileWriter != null) {
                    try {
                        fileWriter.close();
                    } catch (IOException e) {
                        throw new RuntimeException("IOException occurred. ", e);
                    }
                }
            }
        }
    
        /**
         * write file, the string will be written to the begin of the file
         *
         * @param filePath
         * @param content
         * @return
         */
        public static boolean writeFile(String filePath, String content) {
            return writeFile(filePath, content, false);
        }
    
        /**
         * write file, the string list will be written to the begin of the file
         *
         * @param filePath
         * @param contentList
         * @return
         */
        public static boolean writeFile(String filePath, List<String> contentList) {
            return writeFile(filePath, contentList, false);
        }
    
        /**
         * write file, the bytes will be written to the begin of the file
         *
         * @param filePath
         * @param stream
         * @return
         * @see {@link #writeFile(String, InputStream, boolean)}
         */
        public static boolean writeFile(String filePath, InputStream stream) {
            return writeFile(filePath, stream, false);
        }
    
        /**
         * write file
         *
         * @param stream the input stream
         * @param append if <code>true</code>, then bytes will be written to the end of the file rather than the beginning
         * @return return true
         * @throws RuntimeException if an error occurs while operator FileOutputStream
         */
        public static boolean writeFile(String filePath, InputStream stream, boolean append) {
            return writeFile(filePath != null ? new File(filePath) : null, stream, append);
        }
    
        /**
         * write file, the bytes will be written to the begin of the file
         *
         * @param file
         * @param stream
         * @return
         * @see {@link #writeFile(File, InputStream, boolean)}
         */
        public static boolean writeFile(File file, InputStream stream) {
            return writeFile(file, stream, false);
        }
    
        /**
         * write file
         *
         * @param file   the file to be opened for writing.
         * @param stream the input stream
         * @param append if <code>true</code>, then bytes will be written to the end of the file rather than the beginning
         * @return return true
         * @throws RuntimeException if an error occurs while operator FileOutputStream
         */
        public static boolean writeFile(File file, InputStream stream, boolean append) {
            OutputStream o = null;
            try {
                makeDirs(file.getAbsolutePath());
                o = new FileOutputStream(file, append);
                byte data[] = new byte[1024];
                int length = -1;
                while ((length = stream.read(data)) != -1) {
                    o.write(data, 0, length);
                }
                o.flush();
                return true;
            } catch (FileNotFoundException e) {
                throw new RuntimeException("FileNotFoundException occurred. ", e);
            } catch (IOException e) {
                throw new RuntimeException("IOException occurred. ", e);
            } finally {
                if (o != null) {
                    try {
                        o.close();
                        stream.close();
                    } catch (IOException e) {
                        throw new RuntimeException("IOException occurred. ", e);
                    }
                }
            }
        }
    
        /**
         * move file
         *
         * @param sourceFilePath
         * @param destFilePath
         */
        public static void moveFile(String sourceFilePath, String destFilePath) {
            if (TextUtils.isEmpty(sourceFilePath) || TextUtils.isEmpty(destFilePath)) {
                throw new RuntimeException("Both sourceFilePath and destFilePath cannot be null.");
            }
            moveFile(new File(sourceFilePath), new File(destFilePath));
        }
    
        /**
         * move file
         *
         * @param srcFile
         * @param destFile
         */
        public static void moveFile(File srcFile, File destFile) {
            boolean rename = srcFile.renameTo(destFile);
            if (!rename) {
                copyFile(srcFile.getAbsolutePath(), destFile.getAbsolutePath());
                deleteFile(srcFile.getAbsolutePath());
            }
        }
    
        /**
         * copy file
         *
         * @param sourceFilePath
         * @param destFilePath
         * @return
         * @throws RuntimeException if an error occurs while operator FileOutputStream
         */
        public static boolean copyFile(String sourceFilePath, String destFilePath) {
            InputStream inputStream = null;
            try {
                inputStream = new FileInputStream(sourceFilePath);
            } catch (FileNotFoundException e) {
                throw new RuntimeException("FileNotFoundException occurred. ", e);
            }
            return writeFile(destFilePath, inputStream);
        }
    
        /**
         * read file to string list, a element of list is a line
         *
         * @param filePath
         * @param charsetName The name of a supported {@link java.nio.charset.Charset </code>charset<code>}
         * @return if file not exist, return null, else return content of file
         * @throws RuntimeException if an error occurs while operator BufferedReader
         */
        public static List<String> readFileToList(String filePath, String charsetName) {
            File file = new File(filePath);
            List<String> fileContent = new ArrayList<String>();
            if (file == null || !file.isFile()) {
                return null;
            }
    
            BufferedReader reader = null;
            try {
                InputStreamReader is = new InputStreamReader(new FileInputStream(file), charsetName);
                reader = new BufferedReader(is);
                String line = null;
                while ((line = reader.readLine()) != null) {
                    fileContent.add(line);
                }
                reader.close();
                return fileContent;
            } catch (IOException e) {
                throw new RuntimeException("IOException occurred. ", e);
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        throw new RuntimeException("IOException occurred. ", e);
                    }
                }
            }
        }
    
        /**
         * get file name from path, not include suffix
         * <p/>
         * getFileNameWithoutExtension(null)               =   null
         * getFileNameWithoutExtension("")                 =   ""
         * getFileNameWithoutExtension("   ")              =   "   "
         * getFileNameWithoutExtension("abc")              =   "abc"
         * getFileNameWithoutExtension("a.mp3")            =   "a"
         * getFileNameWithoutExtension("a.b.rmvb")         =   "a.b"
         * getFileNameWithoutExtension("c:\\")              =   ""
         * getFileNameWithoutExtension("c:\\a")             =   "a"
         * getFileNameWithoutExtension("c:\\a.b")           =   "a"
         * getFileNameWithoutExtension("c:a.txt\\a")        =   "a"
         * getFileNameWithoutExtension("/home/admin")      =   "admin"
         * getFileNameWithoutExtension("/home/admin/a.txt/b.mp3")  =   "b"
         *
         * @param filePath
         * @return file name from path, not include suffix
         * @see
         */
        public static String getFileNameWithoutExtension(String filePath) {
            if (filePath == null || filePath.length() == 0) {
                return filePath;
            }
    
            int extenPosi = filePath.lastIndexOf(FILE_EXTENSION_SEPARATOR);
            int filePosi = filePath.lastIndexOf(File.separator);
            if (filePosi == -1) {
                return (extenPosi == -1 ? filePath : filePath.substring(0, extenPosi));
            }
            if (extenPosi == -1) {
                return filePath.substring(filePosi + 1);
            }
            return (filePosi < extenPosi ? filePath.substring(filePosi + 1, extenPosi) : filePath.substring(filePosi + 1));
        }
    
        /**
         * get file name from path, include suffix
         * <p/>
         * getFileName(null)               =   null
         * getFileName("")                 =   ""
         * getFileName("   ")              =   "   "
         * getFileName("a.mp3")            =   "a.mp3"
         * getFileName("a.b.rmvb")         =   "a.b.rmvb"
         * getFileName("abc")              =   "abc"
         * getFileName("c:\\")              =   ""
         * getFileName("c:\\a")             =   "a"
         * getFileName("c:\\a.b")           =   "a.b"
         * getFileName("c:a.txt\\a")        =   "a"
         * getFileName("/home/admin")      =   "admin"
         * getFileName("/home/admin/a.txt/b.mp3")  =   "b.mp3"
         *
         * @param filePath
         * @return file name from path, include suffix
         */
        public static String getFileName(String filePath) {
            if (filePath == null || filePath.length() == 0) {
                return filePath;
            }
    
            int filePosi = filePath.lastIndexOf(File.separator);
            return (filePosi == -1) ? filePath : filePath.substring(filePosi + 1);
        }
    
        /**
         * get folder name from path
         * <p/>
         * getFolderName(null)               =   null
         * getFolderName("")                 =   ""
         * getFolderName("   ")              =   ""
         * getFolderName("a.mp3")            =   ""
         * getFolderName("a.b.rmvb")         =   ""
         * getFolderName("abc")              =   ""
         * getFolderName("c:\\")              =   "c:"
         * getFolderName("c:\\a")             =   "c:"
         * getFolderName("c:\\a.b")           =   "c:"
         * getFolderName("c:a.txt\\a")        =   "c:a.txt"
         * getFolderName("c:a\\b\\c\\d.txt")    =   "c:a\\b\\c"
         * getFolderName("/home/admin")      =   "/home"
         * getFolderName("/home/admin/a.txt/b.mp3")  =   "/home/admin/a.txt"
         *
         * @param filePath
         * @return
         */
        public static String getFolderName(String filePath) {
    
            if (filePath == null || filePath.length() == 0) {
                return filePath;
            }
    
            int filePosi = filePath.lastIndexOf(File.separator);
            return (filePosi == -1) ? "" : filePath.substring(0, filePosi);
        }
    
        /**
         * get suffix of file from path
         * <p/>
         * getFileExtension(null)               =   ""
         * getFileExtension("")                 =   ""
         * getFileExtension("   ")              =   "   "
         * getFileExtension("a.mp3")            =   "mp3"
         * getFileExtension("a.b.rmvb")         =   "rmvb"
         * getFileExtension("abc")              =   ""
         * getFileExtension("c:\\")              =   ""
         * getFileExtension("c:\\a")             =   ""
         * getFileExtension("c:\\a.b")           =   "b"
         * getFileExtension("c:a.txt\\a")        =   ""
         * getFileExtension("/home/admin")      =   ""
         * getFileExtension("/home/admin/a.txt/b")  =   ""
         * getFileExtension("/home/admin/a.txt/b.mp3")  =   "mp3"
         *
         * @param filePath
         * @return
         */
        public static String getFileExtension(String filePath) {
            if (filePath == null || filePath.trim().length() == 0) {
                return filePath;
            }
    
            int extenPosi = filePath.lastIndexOf(FILE_EXTENSION_SEPARATOR);
            int filePosi = filePath.lastIndexOf(File.separator);
            if (extenPosi == -1) {
                return "";
            }
            return (filePosi >= extenPosi) ? "" : filePath.substring(extenPosi + 1);
        }
    
        /**
         * Creates the directory named by the trailing filename of this file, including the complete directory path required
         * to create this directory.
         * Attentions:
         * makeDirs("C:\\Users\\Trinea") can only create users folder
         * makeFolder("C:\\Users\\Trinea\\") can create Trinea folder
         *
         * @param filePath
         * @return true if the necessary directories have been created or the target directory already exists, false one of
         * the directories can not be created.
         * if {@link FileUtils#getFolderName(String)} return null, return false
         * if target directory already exists, return true
         * return {@link java.io.File#makeFolder}
         */
        public static boolean makeDirs(String filePath) {
            String folderName = getFolderName(filePath);
            if (filePath == null || filePath.length() == 0) {
                return false;
            }
    
            File folder = new File(folderName);
            return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
        }
    
        /**
         * @param filePath
         * @return
         * @see #makeDirs(String)
         */
        public static boolean makeFolders(String filePath) {
            return makeDirs(filePath);
        }
    
        /**
         * Indicates if this file represents a file on the underlying file system.
         *
         * @param filePath
         * @return
         */
        public static boolean isFileExist(String filePath) {
            if (filePath == null || filePath.trim().length() == 0) {
                return false;
            }
    
            File file = new File(filePath);
            return (file.exists() && file.isFile());
        }
    
        /**
         * Indicates if this file represents a directory on the underlying file system.
         *
         * @param directoryPath
         * @return
         */
        public static boolean isFolderExist(String directoryPath) {
            if (directoryPath == null || directoryPath.trim().length() == 0) {
                return false;
            }
    
            File dire = new File(directoryPath);
            return (dire.exists() && dire.isDirectory());
        }
    
        /**
         * delete file or directory
         *
         * if path is null or empty, return tru
         * if path not exist, return true
         * if path exist, delete recursion. return true
         *
         * @param path
         * @return
         */
        public static boolean deleteFile(String path) {
            if (path == null || path.trim().length() == 0) {
                return true;
            }
    
            File file = new File(path);
            if (!file.exists()) {
                return true;
            }
            if (file.isFile()) {
                return file.delete();
            }
            if (!file.isDirectory()) {
                return false;
            }
            for (File f : file.listFiles()) {
                if (f.isFile()) {
                    f.delete();
                } else if (f.isDirectory()) {
                    deleteFile(f.getAbsolutePath());
                }
            }
            return file.delete();
        }
    
        /**
         * get file size
         * if path is null or empty, return -1
         * <if path exist and it is a file, return file size, else return -1
         *
         * @param path
         * @return returns the length of this file in bytes. returns -1 if the file does not exist.
         */
        public static long getFileSize(String path) {
            if (path == null || path.trim().length() == 0) {
                return -1;
            }
    
            File file = new File(path);
            return (file.exists() && file.isFile() ? file.length() : -1);
        }
    
    }
    

    本来之前用UUID获取是没有问题的
    原文章地址 : Unity功能记录(二十) ------ 获取Android与ios唯一设备标识码UUID
    但是呢,突然所有华为设备获取到的UUID都是一致的,虽然不知道是什么原因导致的,因此改成以下方法:

    import android.content.Context;
    import android.os.Environment;
    import android.provider.Settings;
    
    import java.io.File;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.UUID;
    
    public class UniversalID {
    
        private static String filePath = File.separator + "UTips" + File.separator + "UUID";
    
        public static String getUniversalID(Context context) {
            String androidId;
            String fileRootPath = getPath(context) + filePath;
            String uuid = FileUtils.readFile(fileRootPath);
            if (uuid == null || uuid.equals("")) {
                androidId = "" + Settings.Secure.getString(context.getContentResolver(),
                        Settings.Secure.ANDROID_ID);
                try {
                    if (!"9774d56d682e549c".equals(androidId)) {
                        uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")).toString();
                    } else {
                        uuid = UUID.randomUUID().toString();
                    }
                } catch (Exception e) {
                    uuid = UUID.randomUUID().toString();
                }
                if(!uuid.equals("")){
                    saveUUID(context,uuid);
                }
            }
            return uuid;
        }
    
        private static void saveUUID(Context context, String UUID) {
            String ExternalSdCardPath = getExternalSdCardPath() + filePath;
            FileUtils.writeFile(ExternalSdCardPath, UUID);
            String InnerPath = context.getFilesDir().getAbsolutePath() + filePath;
            FileUtils.writeFile(InnerPath,UUID);
        }
    
        public static String getPath(Context context) {
            //首先判断是否有外部存储卡,如没有判断是否有内部存储卡,如没有,继续读取应用程序所在存储
            String phonePicsPath = getExternalSdCardPath();
            if (phonePicsPath == null) {
                phonePicsPath = context.getFilesDir().getAbsolutePath();
            }
            return phonePicsPath;
        }
    
        /**
         * 遍历 "system/etc/vold.fstab” 文件,获取全部的Android的挂载点信息
         *
         * @return
         */
        private static ArrayList<String> getDevMountList() {
            String[] toSearch = FileUtils.readFile("/system/etc/vold.fstab").split(" ");
            ArrayList<String> out = new ArrayList<>();
            for (int i = 0; i < toSearch.length; i++) {
                if (toSearch[i].contains("dev_mount")) {
                    if (new File(toSearch[i + 2]).exists()) {
                        out.add(toSearch[i + 2]);
                    }
                }
            }
            return out;
        }
    
        /**
         * 获取扩展SD卡存储目录
         * <p/>
         * 如果有外接的SD卡,并且已挂载,则返回这个外置SD卡目录
         * 否则:返回内置SD卡目录
         *
         * @return
         */
        public static String getExternalSdCardPath() {
    
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                File sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
                return sdCardFile.getAbsolutePath();
            }
    
            String path = null;
    
            File sdCardFile = null;
    
            ArrayList<String> devMountList = getDevMountList();
    
            for (String devMount : devMountList) {
                File file = new File(devMount);
    
                if (file.isDirectory() && file.canWrite()) {
                    path = file.getAbsolutePath();
    
                    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date());
                    File testWritable = new File(path, "test_" + timeStamp);
    
                    if (testWritable.mkdirs()) {
                        testWritable.delete();
                    } else {
                        path = null;
                    }
                }
            }
    
            if (path != null) {
                sdCardFile = new File(path);
                return sdCardFile.getAbsolutePath();
            }
    
            return null;
        }
    
    }
    

    已测试过vivo/小米/华为三款手机,无论是重启还是卸载重装,获取到的UUID是一致的

    参考网站 :

    如何唯一的标识一台Android设备?

    相关文章

      网友评论

          本文标题:Android功能记录(一) ------ 获取手机唯一标识码

          本文链接:https://www.haomeiwen.com/subject/wckaoqtx.html