Как я могу получить уникальный идентификатор устройства в Android 10?

Я хочу получить уникальный идентификатор устройства в своем приложении. Но согласно документу Google говорится, что Android 10 добавляет ограничения для несбрасываемых идентификаторов.

Мне не нужен случайный идентификатор. Я хочу получить уникальный идентификатор, чтобы я мог идентифицировать устройство, с которого попадает мой API. и тем самым я могу управлять своим сеансом. есть ли другой уникальный идентификатор, кроме Secure.android_id, который уникален для Android? или есть ли способ получить доступ к Secure.android_id в Android 10.


person Ankur Shinde    schedule 03.03.2020    source источник
comment
Вы можете прочитать о своих вариантах и ​​принять соответствующее решение по ссылке ниже: developer.android. com/training/articles/user-data-id   -  person Dogu Deniz Ugur    schedule 03.03.2020


Ответы (3)


Вы получите MAC-адрес Wi-Fi (для некоторых устройств, таких как Xiaomi, это вернет MAC-адрес Wi-Fi-direct), используя следующий код, независимо от того, использовали ли вы рандомизированный адрес при попытке подключения к Wi-Fi или нет, и независимо от того был ли включен вайфай или выключен.

Я использовал метод по ссылке ниже и добавил небольшую модификацию, чтобы получить точный адрес вместо рандомизированного:

Получение MAC-адреса в Android 6.0

public static String getMacAddr() {
    StringBuilder res1 = new StringBuilder();
    try {
        List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface nif : all) {
            if (!nif.getName().equalsIgnoreCase("p2p0")) continue;

            byte[] macBytes = nif.getHardwareAddress();
            if (macBytes == null) {
                continue;
            }

            res1 = new StringBuilder();
            for (byte b : macBytes) {
                res1.append(String.format("%02X:",b));
            }

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
        }
    } catch (Exception ex) {
    }
    return res1.toString();
}
person Abdallah AlTaher    schedule 05.08.2020
comment
Можете ли вы объяснить свой код? Например, почему он всегда возвращает реальный MAC-адрес вместо рандомизированного? Изменится ли он, если мы перезагрузим телефон/сброс к заводским настройкам? - person SweArmy; 16.11.2020
comment
Привет, он возвращает настоящий mac-адрес, потому что это то, что нам нужно от этого метода. Что касается рандомизации, вы знаете, что в Android 10+, если вы использовали рандомизированный mac-адрес при подключении к Wi-Fi, а затем пытались получить mac-адрес любым другим способом для получения mac-адреса, вы получите рандомизированный вместо настоящий. И этот метод всегда получает реальный и он не изменится, если вы выключили Wi-Fi или перезагрузили устройство или выполнили сброс настроек или прошивку устройства. - person Abdallah AlTaher; 18.11.2020
comment
Что, если я воспользуюсь рутированным телефоном и подменю/изменю свой mac-адрес? Вернет ли он реальный MAC-адрес? - person SweArmy; 02.12.2020
comment
Честно говоря, я не проверял это на рутированном устройстве, если у вас есть, проверьте его и поделитесь с нами результатом. - person Abdallah AlTaher; 06.12.2020

Вы можете получить уникальный идентификатор Android для устройства, используя это, для этого вам нужно получить android.permission.READ_PHONE_STATE

private String android_id = Secure.getString(getContext().getContentResolver(),
                                                        Secure.ANDROID_ID); 
person Rajendra Dabhi    schedule 03.03.2020

По моему мнению, вы должны использовать приведенный ниже код, чтобы получить уникальный идентификатор -

String uniqueID = UUID.randomUUID().toString();

приведенный выше код не требует от пользователя разрешения во время выполнения для доступа к идентификатору устройства и всегда генерирует уникальный идентификатор. Вы можете сопоставить этот уникальный идентификатор с данными пользователя или манипулировать им в соответствии с вашими потребностями.

Спасибо

person Dipankar Baghel    schedule 03.03.2020
comment
Мне не нужен случайный идентификатор. Я хочу получить уникальный идентификатор, чтобы я мог идентифицировать устройство, с которого попадает мой API. и тем самым я могу управлять своим сеансом. есть ли другой уникальный идентификатор, кроме Secure.android_id, который уникален для Android? или это какой-либо способ получить доступ к Secure.android_id в Android 10. - person Ankur Shinde; 04.03.2020
comment
Привет. Итак, как вы решили свою проблему, чтобы получить постоянный уникальный идентификатор? - person rohit garg; 26.10.2020