デバイス固有のシリアル番号を生成[重複
-
27-09-2019 - |
質問
この質問にはすでに答えがあります:
アプリケーションのロックを解除するために使用するために、各Androidデバイスの一意のシリアル番号を生成できるようにしたいと思います。どうすればこれを行うことができますか?
編集:
その理由は、有料アプリケーションを改良し、古いバージョンの支払いを行ったユーザーに提供したいということです。これには、ロック解除可能な無料バージョンのアプリケーションをダウンロードしてフルバージョンを取得する方法があります。無料バージョンを完全に機能的なバージョンに変えるために入力できるコードを生成して表示する古いバージョンの更新をプッシュします。
解決
使用できます Android ID. 。このIDはデバイスに固有のものでなければなりませんが、設定方法はデバイスメーカーの実装に依存します。
String deviceId = Secure.getString(context.getContentResolver(),Secure.ANDROID_ID);
Android IDは、電話の工場出荷時に変更される場合があり、ユーザーはルート付き電話で変更することもできます。ただし、ユーザーを識別するためにIDが必要な場合は問題ありません。
他のヒント
Googleアカウント名を使用してみませんか?簡単に入手でき、マニフェストファイルに簡単なリクエストのみが必要です。彼らはgplayでライセンスを購入したので、G+アカウント名で十分なはずです...
マニフェストで:
<manifest ... >
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
...
</manifest>
アカウント名を取得するには:
AccountManager am = AccountManager.get(this); // "this" references the current Context
Account[] accounts = am.getAccountsByType("com.google");
名前を取得するには:
accounts[0].name
ここでコード全体を見つけたことを確認するために、簡単なアラートを書きます。
Account[] accounts = am.getAccountsByType("com.google");
AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
miaAlert.setTitle("i found an account name!");
miaAlert.setMessage(accounts[0].name);
AlertDialog alert = miaAlert.create();
alert.show();
Androidはすでにaを提供します ライセンスサービス 有料アプリで使用するため。これを使いたくない理由はありますか?アプリを特定の電話にロックしようとすると、デバイスを切り替えるユーザー(たとえば、遅かれ早かれ)を悩ませることに注意してください。
PRNGの問題を解決するGoogle開発者のソリューションから、リフレクションを介して一意のデバイスシリアル番号を取得します。
http://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html
/**
* Gets the hardware serial number of this device.
*
* @return serial number or {@code null} if not available.
*/
private static String getDeviceSerialNumber() {
// We're using the Reflection API because Build.SERIAL is only available
// since API Level 9 (Gingerbread, Android 2.3).
try {
return (String) Build.class.getField("SERIAL").get(null);
} catch (Exception ignored) {
return null;
}
}
これにはIMEI NOを使用できます。
シリアル番号は、すべてのデバイスでavailbalbleであるため、一意の識別子として使用できます。WiFiタブ(SIMカードスロットがないタブ)でアバリベールではないため、IMEIを一意の識別子として使用しないでください。
使用できます
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class, String.class);
serial = (String) get.invoke(c, "ril.serialnumber", "unknown");
} catch (Exception ignored) {
}