web-dev-qa-db-ja.com

アプリケーションでAndroid電話のUUIDを取得するにはどうすればよいですか?

Android携帯電話のUUIDを取得するためのヘルプを探しています。ネットを検索し、1つの潜在的な解決策を見つけましたが、エミュレーターで機能していません。

コードは次のとおりです。

Class<?> c;
try {
    c = Class.forName("Android.os.SystemProperties");
    Method get = c.getMethod("get", String.class);
    serial = (String) get.invoke(c, "ro.serialno");
    Log.d("Android UUID",serial);
} catch (Exception e) {
    e.printStackTrace();
}

なぜ機能していないのか、またはより良い解決策があるのか​​知っていますか?

49
bHaRaTh

これは私のために働く:

TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String uuid = tManager.getDeviceId();

編集:

マニフェストにAndroid.permission.READ_PHONE_STATEを設定する必要もあります。 Android Mなので、実行時にこの許可を求める必要があります。

このanwserを参照してください: https://stackoverflow.com/a/38782876/1339179

63
pedr0

Dave Webbが言及しているように、 Android開発者ブログには記事があります これについて説明しています。推奨されるソリューションは、デバイスではなくアプリのインストールを追跡することです。これは、ほとんどのユースケースでうまく機能します。ブログの投稿には、その機能を実現するために必要なコードが記載されていますので、チェックしてみることをお勧めします。

ただし、ブログの投稿では、アプリのインストール識別子ではなくデバイス識別子が必要な場合のソリューションについて説明しています。 Googleの誰かと話をして、あなたがそうする必要がある場合に、いくつかの項目について追加の説明をもらいました。前述のブログ投稿で言及されていないデバイス識別子について私が発見したものは次のとおりです。

  • Android_IDは優先デバイス識別子です。 Android_IDは、Android <= 2.1または> = 2.3のバージョンで完全に信頼できます。投稿で言及されている問題があるのは2.2のみです。
  • いくつかのメーカーのいくつかのデバイスは、2.2のAndroid_IDバグの影響を受けます。
  • 私が判断できた限り、影響を受けるすべてのデバイスには 同じAndroid_ID があり、これは 9774d56d682e549c です。これは、エミュレータが報告するのと同じデバイスIDです。
  • Googleは、OEMがデバイスの多くまたはほとんどの問題にパッチを適用したと考えていますが、少なくとも2011年4月の初めから、破損したAndroid_IDを持つデバイスを見つけるのは非常に簡単であることを確認できました。
  • デバイスに複数のユーザーがいる場合 (Android 4.2以降)を実行している特定のデバイスで利用可能 、各ユーザーは完全に別個のデバイスとして表示されるため、Android_ID値は各ユーザー。

Googleの推奨に基づいて、必要に応じてAndroid_IDをシードとして使用し、必要に応じてTelephonyManager.getDeviceId()にフォールバックし、それが失敗した場合はランダムに生成された一意のUUIDに頼って、各デバイスに一意のUUIDを生成するクラスを実装しましたアプリの再起動後も保持されます(ただし、アプリの再インストールは保持されません)。

デバイスIDにフォールバックする必要があるデバイスの場合、一意のID[〜#〜] [〜#〜]は工場出荷時のリセット後も保持されます。これは知っておくべきことです。工場出荷時設定にリセットして固有のIDをリセットする必要がある場合は、デバイスIDではなくランダムUUIDに直接フォールバックすることを検討してください。

繰り返しますが、このコードはアプリのインストールIDではなく、デバイスID用です。ほとんどの場合、アプリのインストールIDはおそらく探しているものです。ただし、デバイスIDが必要な場合は、次のコードがおそらく機能します。

import Android.content.Context;
import Android.content.SharedPreferences;
import Android.provider.Settings.Secure;
import Android.telephony.TelephonyManager;

import Java.io.UnsupportedEncodingException;
import Java.util.UUID;

public class DeviceUuidFactory {
    protected static final String PREFS_FILE = "device_id.xml";
    protected static final String PREFS_DEVICE_ID = "device_id";

    protected static UUID uuid;



    public DeviceUuidFactory(Context context) {

        if( uuid ==null ) {
            synchronized (DeviceUuidFactory.class) {
                if( uuid == null) {
                    final SharedPreferences prefs = context.getSharedPreferences( PREFS_FILE, 0);
                    final String id = prefs.getString(PREFS_DEVICE_ID, null );

                    if (id != null) {
                        // Use the ids previously computed and stored in the prefs file
                        uuid = UUID.fromString(id);

                    } else {

                        final String androidId = Secure.getString(context.getContentResolver(), Secure.Android_ID);

                        // Use the Android ID unless it's broken, in which case fallback on deviceId,
                        // unless it's not available, then fallback on a random number which we store
                        // to a prefs file
                        try {
                            if (!"9774d56d682e549c".equals(androidId)) {
                                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
                            } else {
                                final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
                                uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();
                            }
                        } catch (UnsupportedEncodingException e) {
                            throw new RuntimeException(e);
                        }

                        // Write the value out to the prefs file
                        prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString() ).commit();

                    }

                }
            }
        }

    }


    /**
     * Returns a unique UUID for the current Android device.  As with all UUIDs, this unique ID is "very highly likely"
     * to be unique across all Android devices.  Much more so than Android_ID is.
     *
     * The UUID is generated by using Android_ID as the base key if appropriate, falling back on
     * TelephonyManager.getDeviceID() if Android_ID is known to be incorrect, and finally falling back
     * on a random UUID that's persisted to SharedPreferences if getDeviceID() does not return a
     * usable value.
     *
     * In some rare circumstances, this ID may change.  In particular, if the device is factory reset a new device ID
     * may be generated.  In addition, if a user upgrades their phone from certain buggy implementations of Android 2.2
     * to a newer, non-buggy version of Android, the device ID may change.  Or, if a user uninstalls your app on
     * a device that has neither a proper Android ID nor a Device ID, this ID may change on reinstallation.
     *
     * Note that if the code falls back on using TelephonyManager.getDeviceId(), the resulting ID will NOT
     * change after a factory reset.  Something to be aware of.
     *
     * Works around a bug in Android 2.2 for many devices when using Android_ID directly.
     *
     * @see http://code.google.com/p/Android/issues/detail?id=10603
     *
     * @return a UUID that may be used to uniquely identify your device for most purposes.
     */
    public UUID getDeviceUuid() {
        return uuid;
    }
}
100
emmby
<uses-permission Android:name="Android.permission.READ_PHONE_STATE"></uses-permission>
7
Anil Bhatiya

TelephonyManagerからIMEIを取得する代わりに、Android_IDを使用します。

Settings.Secure.Android_ID

これは、テレフォニーの有無に関係なく、各Androidデバイスに対して機能します。

5
porwalankit
 String id = UUID.randomUUID().toString();

IDクラスを使用してuuidを取得するためのAndroid Developerブログ記事 を参照してください

4
Gopi cg

追加

  <uses-permission Android:name="Android.permission.READ_PHONE_STATE"/>

方法

String getUUID(){
    TelephonyManager teleManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    String tmSerial = teleManager.getSimSerialNumber();
    String tmDeviceId = teleManager.getDeviceId();
    String androidId = Android.provider.Settings.Secure.getString(getContentResolver(), Android.provider.Settings.Secure.Android_ID);
    if (tmSerial  == null) tmSerial   = "1";
    if (tmDeviceId== null) tmDeviceId = "1";
    if (androidId == null) androidId  = "1";
    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDeviceId.hashCode() << 32) | tmSerial.hashCode());
    String uniqueId = deviceUuid.toString();
    return uniqueId;
}
1
KongJing

API 26の時点で、getDeviceId()は非推奨です。デバイスのIMEIを取得する必要がある場合は、次を使用します。

 String deviceId = "";
    if (Build.VERSION.SDK_INT >= 26) {
        deviceId = getSystemService(TelephonyManager.class).getImei();
    }else{
        deviceId = getSystemService(TelephonyManager.class).getDeviceId();
    }
0
DummyData