2011-07-06 3 views
2

私はアンドロイドマーケットに有料アプリを公開しようとしています。アプリはLVL(アプリケーションライセンス)を使用します。ライセンスを検証するためには、デバイスの一意のIDを指定する必要があります。私は頼ることができないので、私もTelephonyManagerクラスを使用することができますが、アプリはまた、タブレットデバイスをターゲットにしアプリケーションライセンスとアンドロイドユニークID

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

:問題は、呼び出し時に(原因既知の問題への)いくつかのAndroidデバイスは、同じ「ユニークな」IDを持っているということですその上に。

あなたの誰かがLVLを使用している場合は、LicenseChecker()オブジェクトを作成する際に、どのようにdevices'idを取得したか教えてください。同じデバイスIDを持つ2人のユーザーがアプリを購入しようとするとどうなるかを理解しようとしています。

答えて

1

同じIDを持つ2つのデバイスは、他のデバイスに無料でアプリを提供しますが、LVLは引き続きGoogle IDで動作します。 LVLはGoogleの認証を使用しているため、IDが同じでGoogle IDが同じユーザーが同じアプリを購入することはほとんどありません。特に彼らはすでにそれを所有しているので!

それは以下しようと解決しない場合:

http://developer.android.com/guide/publishing/licensing.html状態:

をデバイス識別子を保持し、必要に応じていずれかの方法でそれに値を生成するための変数を宣言します。たとえば、LVLに含まれるサンプル・アプリケーションは、各デバイスに固有のandroid.Settings.Secure.ANDROID_IDのシステム設定を照会します。

使用するAPIによっては、デバイス固有の情報を取得するためにアプリケーションで追加のアクセス権を要求する必要があることに注意してください。たとえば、デバイスIMEIまたは関連データを取得するためにTelephonyManagerを照会するには、アプリケーションはマニフェストでandroid.permission.READ_PHONE_STATE権限も要求する必要があります。

Obfuscatorで使用するデバイス固有の情報を取得する唯一の目的で新しい権限を要求する前に、その方法がアプリケーションやAndroidマーケットでのフィルタリングにどのように影響するかを検討してください(一部の権限でSDKビルドツールで関連する)。

この公式のAndroid開発者ブログ投稿を参照してください、あなたのアプリケーションがからインストールされている各Androidデバイスの一意の識別子を取得する方法の詳細については
1

:最良の方法は、あなたがするためであると思われる

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

インストール時に自分自身を生成し、アプリケーションが再起動されたときにそれを読み取ることができます。

私はこれを個人的には認めていますが理想的ではありません。ほとんどの場合、携帯電話の無線状態(無線オン/オフ、携帯電話のオン/オフ、ブルートゥースのオン/オフ)に依存するため、Androidで提供される識別子はすべてのインスタンスで動作しません。 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(); 
    } 
} 
関連する問題