Лицензирование приложений и уникальный идентификатор Android

Я собираюсь опубликовать платное приложение на рынке Android. Приложение использует LVL (лицензирование приложений). Чтобы подтвердить лицензию, я должен предоставить уникальный идентификатор устройства. Проблема в том, что некоторые устройства Android (из-за известной проблемы) имеют одинаковые «уникальные» идентификаторы при вызове:

Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Я также мог бы использовать класс TelephonyManager, но приложение также предназначено для планшетных устройств, поэтому я не могу на это полагаться.

Если кто-то из вас, ребята, использовал LVL, сообщите мне, как вы получили идентификатор устройства при создании объекта LicenseChecker(). Я просто пытаюсь понять, что может произойти, если два пользователя с одинаковым идентификатором устройства попытаются купить приложение.


person Marqs    schedule 06.07.2011    source источник


Ответы (2)


Два устройства с одним и тем же идентификатором просто бесплатно передают приложение другому устройству, однако LVL по-прежнему работает с идентификаторами Google. Поскольку LVL использует аутентификацию Google, крайне редко можно увидеть, как кто-то с таким же идентификатором и тем же идентификатором Google покупает одно и то же приложение. Тем более, что он у них уже есть!

Если это не поможет, попробуйте ниже:

http://developer.android.com/guide/publishing/licensing.html состояния:

объявить переменную для хранения идентификатора устройства и сгенерировать для него значение любым необходимым способом. Например, пример приложения, включенный в LVL, запрашивает системные настройки для android.Settings.Secure.ANDROID_ID, который уникален для каждого устройства.

Обратите внимание, что в зависимости от используемых вами API вашему приложению может потребоваться запросить дополнительные разрешения для получения информации об устройстве. Например, чтобы запросить TelephonyManager для получения IMEI устройства или связанных данных, приложению также потребуется запросить разрешение android.permission.READ_PHONE_STATE в своем манифесте.

Прежде чем запрашивать новые разрешения с единственной целью получения информации об устройстве для использования в вашем обфускаторе, подумайте, как это может повлиять на ваше приложение или его фильтрацию на Android Market (поскольку некоторые разрешения могут привести к тому, что инструменты сборки SDK добавят соответствующие файлы ).

person Chris Lucian    schedule 27.07.2011

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

http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

Кажется, лучший способ для вас - создать его самостоятельно при установке и впоследствии прочитать его при повторном запуске приложения.

Я лично нахожу это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, не работает во всех случаях, поскольку большинство из них зависят от состояния радиосвязи телефона (включение/выключение Wi-Fi, включение/выключение сотовой связи, включение/выключение Bluetooth). Другие, такие как Settings.Secure.ANDROID_ID, должны быть реализованы производителем, и их уникальность не гарантируется.

Ниже приведен пример записи данных в файл INSTALLATION, который будет храниться вместе с любыми другими данными, которые приложение сохраняет локально.

public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";

    public synchronized static String id(Context context) {
        if (sID == null) {  
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }

    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }

    private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
}
person Kevin Parker    schedule 02.08.2011