2

有料アプリをAndroidマーケットに公開しようとしています。アプリは LVL (Application Licensing) を使用しています。ライセンスを検証するには、デバイスの一意の ID を提供する必要があります。問題は、一部の Android デバイス (既知の問題による) が、呼び出し時に同じ「一意の」ID を持っていることです。

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

TelephonyManager クラスを使用することもできますが、アプリはタブレット デバイスも対象としているため、信頼できません。

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

4

2 に答える 2

1

アプリケーションのインストール元の Android デバイスごとに一意の識別子を取得する方法の詳細については、次の公式の Android 開発者ブログの投稿を参照してください。

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

インストール時に自分で生成し、アプリケーションの再起動時にそれを読み取るのが最善の方法のようです。

個人的にはこれは許容範囲内ですが、理想的ではありません。Android が提供する 1 つの識別子がすべてのインスタンスで機能するわけではありません。そのほとんどは、電話の無線状態 (wifi のオン/オフ、セルラーのオン/オフ、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();
    }
}
于 2011-08-02T03:21:11.470 に答える
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 によっては、デバイス固有の情報を取得するために、アプリケーションで追加のアクセス許可を要求する必要がある場合があることに注意してください。たとえば、TelephonyManager にクエリを実行してデバイスの IMEI または関連データを取得するには、アプリケーションはマニフェストで android.permission.READ_PHONE_STATE パーミッションも要求する必要があります。

難読化ツールで使用するデバイス固有の情報を取得するという唯一の目的で新しいアクセス許可を要求する前に、アプリケーションや Android マーケットでのフィルタリングにどのような影響があるかを検討してください (アクセス許可によっては、SDK ビルド ツールが関連する を追加する可能性があるため)。

于 2011-07-27T20:15:07.593 に答える