2011-07-06 4 views
2

Je suis sur le point de publier l'application payante sur le marché android. L'application utilise LVL (Application Licensing). Afin de valider la licence, je dois fournir l'identifiant unique de l'appareil. Le problème est que certains appareils Android (en raison de problèmes connus) ont les mêmes « uniques » ids, lors de l'appel:Licence d'application et ID unique android

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

Je pourrais aussi utiliser la classe TelephonyManager mais l'application cible également les dispositifs de tablette, donc je ne peux pas compter sur ça.

Si quelqu'un d'entre vous a utilisé LVL, faites-moi savoir comment vous avez obtenu l'ID de périphérique lors de la création de l'objet LicenseChecker(). J'essaye juste de comprendre ce qui pourrait arriver si deux utilisateurs avec le même identifiant d'appareil essayaient d'acheter l'application.

Répondre

1

Deux appareils avec le même identifiant donneraient l'application gratuitement à l'autre appareil, mais le LVL fonctionne toujours avec les ID Google. Comme le LVL utilise l'authentification de Google, il est extrêmement rare que vous voyiez quelqu'un avec le même identifiant et le même identifiant Google acheter la même application. Surtout qu'ils le possèdent déjà!

Si cela ne vous aide pas essayer ci-dessous:

http://developer.android.com/guide/publishing/licensing.html états:

Déclarez une variable pour contenir un identifiant de l'appareil et générer une valeur pour elle de quelque manière que nécessaire. Par exemple, l'exemple d'application inclus dans le LVL interroge les paramètres système de android.Settings.Secure.ANDROID_ID, qui est propre à chaque périphérique. Notez que, en fonction des API que vous utilisez, votre application peut avoir besoin de demander des autorisations supplémentaires afin d'acquérir des informations spécifiques au périphérique. Par exemple, pour interroger TelephonyManager afin d'obtenir le périphérique IMEI ou des données connexes, l'application doit également demander l'autorisation android.permission.READ_PHONE_STATE dans son manifeste. Avant de demander de nouvelles autorisations dans le seul but d'acquérir des informations spécifiques aux périphériques à utiliser dans votre Obfuscator, pensez à comment cela pourrait affecter votre application ou son filtrage sur Android Market (certaines autorisations peuvent entraîner l'ajout d'outils de développement SDK l'associé).

1

Pour obtenir des instructions détaillées sur la façon d'obtenir un identifiant unique pour chaque appareil Android application est installé à partir, consultez cette Android officielle Développeurs affichage Blog:

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

Il semble que la meilleure façon est pour vous générer un soi-même lors de l'installation et ensuite le lire lorsque l'application est relancée.

Personnellement, je trouve cela acceptable mais pas idéal. Aucun identifiant fourni par Android ne fonctionne dans tous les cas, car la plupart dépendent des états radio du téléphone (activation/désactivation du Wi-Fi, activation/désactivation du téléphone portable, activation/désactivation du Bluetooth). Les autres paramètres tels que Settings.Secure.ANDROID_ID doivent être implémentés par le fabricant et ne sont pas garantis être uniques. Voici un exemple d'écriture de données dans un fichier INSTALLATION qui serait stocké avec d'autres données sauvegardées localement par l'application.

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(); 
    } 
}