6

一意のAndroidIDについて話すとき、誰もがこれを見たことがあると思いますが、私もAndroidデバイスを一意に識別するための解決策を考え出そうとしています。公開されているクラスを利用したいのですが、まだ見つけていません。

私の状況では、何らかの形のインターネット接続(GPRSやWi-Fiなど)を備え、APIレベル8(v2.2 Froyo)で実行されているデバイスを一意に識別できることが要件です。Wi-FiやSIMが搭載されていないデバイスを知りませんので、ある場合はお知らせください。

すべてのiOSデバイスにWi-FiMACアドレスが必要なため、Wi-FiMACアドレスのハッシュを使用してiOSでこの問題を解決しました。ただし、Androidの場合、テクニック(上記のSO投稿への回答など)は、TelephonyManager戻ることができるクラスnull(Nexus 7のようにデバイスにSIM接続がない場合など)getContext().getContentResolver(), Secure.ANDROID_IDを指します。 Froyoより前のバージョンでは100%信頼できません(これは私にとって幸運です)。ただし、フローズンヨーグルト後の問題は記載されていないので、問題があればお知らせください。私もこれを読んだことがありますnullここによると、工場出荷時のリセットで変更される可能性がありますが、それは大きな問題ではありません。

そこで、これをまとめて、うまくいけば一意のGUIDを生成します。[このメソッドは完全ではありません。]

public static String GetDeviceId(Context context)
{
    // Custom String Hash 1
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("someRandomData"); // Not really needed, but means the stringBuilders value won't ever be null

    // TM Device String
    final TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    String tmDeviceId = tm.getDeviceId(); // Could well be set to null!
    LogMsg.Tmp("TM Device String [" + tmDeviceId + "]");

    // Custom String Hash 2
    stringBuilder.append(tmDeviceId);
    int customHash = stringBuilder.toString().hashCode();
    LogMsg.Tmp("Custom String hash [" + customHash + "]");

    // Device ID String
    String androidIDString = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
    LogMsg.Tmp("Device ID String [" + androidIDString + "]");

    // Combined hashes as GUID
    UUID deviceUuid = new UUID(androidIDString.hashCode(), ((long)customHash << 32));
    LogMsg.Tmp("Combined hashes as GUID [" + deviceUuid.toString() + "]");

    return deviceUuid.toString();
}

したがって、tmDeviceIdに設定されている場合がありますnull。この場合、customHashデバイスに関係なく同じになりますが、と組み合わせるとandroidIDStringグローバルに一意になります。おもう。明らかに、tmDeviceIdANDandroidIDStringが使用できない場合は解決し、そこで例外をスローする必要があります。

それで...これはやり過ぎですか?もしそうなら、そのまま使用しても安全context.getContentResolver(), android.provider.Settings.Secure.ANDROID_IDですか?

4

1 に答える 1

3

iOS で行ったように、デバイスの MAC アドレスを取得してみませんか? これは、Android デバイスでも実行できます。

デバイスの MAC アドレスを取得するコード スニペットを提供します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HardwareUtil {

    public static String getMacAddress()
    {
        try{
            Process process = Runtime.getRuntime().exec("cat /sys/class/net/eth0/address");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            int read;
            char[] buffer = new char[4096];
            StringBuffer output = new StringBuffer();
            while ((read = reader.read(buffer)) > 0){
                output.append(buffer, 0, read);
            }
            reader.close();
            process.waitFor();
            String hwaddr = output.toString();
            return hwaddr;
        }catch (IOException e) {
            e.printstacktrace();
        }catch (InterruptedException e){
            e.printstacktrace();
        }
    }

}

HardwareUtil.getMacAddress()デバイスの MAC アドレスを返します。

編集:MACアドレスが状況に適していない場合。以下は便利です!

public static String getDeviceId(Context context) {
    final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
    if (deviceId != null) {
        return deviceId;
    } else {
        return android.os.Build.SERIAL;
    }
}

AndoridManifest.xmlメソッドを使用する場合は、次の権限をファイルに追加することを忘れないでくださいgetDeviceId

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
于 2013-10-07T13:58:57.480 に答える