Benzersiz bir Android cihaz kimli─či var m─▒?


Al─▒nan cevaba git


Android cihazlar─▒n benzersiz bir kimlikleri var m─▒, ve e─čer ├Âyleyse, Java kullanarak eri┼čmenin basit bir yolu nedir?


2619









Cevap say─▒s─▒n─▒ say: 30






Settings.Secure#ANDROID_ID Android kimli─čini her kullan─▒c─▒ i├žin 64-bit hex string i├žin benzersiz olarak d├Ând├╝r├╝r .

 import android.provider.Settings.Secure;

private String android_id = Secure.getString(getContext().getContentResolver(),
                                                        Secure.ANDROID_ID); 
 

1916







G├ťNCELLEME : Android'in son s├╝r├╝mleri itibariyle, sorunlar─▒n ANDROID_ID ├žo─ču ├ž├Âz├╝ld├╝ ve bu yakla┼č─▒m─▒n art─▒k gerekli olmad─▒─č─▒na inan─▒yorum. L├╝tfen Anthony'nin cevab─▒na bak─▒n─▒z .

Tam a├ž─▒klama: Uygulamam as─▒l olarak a┼ča─č─▒daki yakla┼č─▒m─▒ kulland─▒, ancak art─▒k bu yakla┼č─▒m─▒ kullanm─▒yor ve ┼čimdi de Android Geli┼čtirici Blogu giri┼činde belirtilen ve emmby'nin cevaplar─▒n─▒n ba─člant─▒ olu┼čturdu─ču yakla┼č─▒m─▒ kullan─▒yoruz (yani, olu┼čturma ve kaydetme UUID#randomUUID() ).


Bu soruya ├žo─ču zaman sadece bir k─▒sm─▒ i┼če yarayacak bir├žok cevap var ve ne yaz─▒k ki bu yeterince iyi de─čil.

Cihaz testlerime g├Âre (en az biri etkin olmayan t├╝m telefonlar):

  1. Test edilen t├╝m cihazlar i├žin bir de─čer d├Ând├╝rd├╝ TelephonyManager.getDeviceId()
  2. T├╝m GSM cihazlar─▒ (t├╝m├╝ SIM ile test edilmi┼č), TelephonyManager.getSimSerialNumber()
  3. T├╝m CDMA ayg─▒tlar─▒ i├žin bo┼č de─čeri d├Ând├╝r├╝ld├╝ getSimSerialNumber() (beklendi─či gibi)
  4. Google hesab─▒ eklenmi┼č t├╝m cihazlar i├žin de─čer d├Ând├╝rd├╝ ANDROID_ID
  5. T├╝m CDMA cihazlar her ikisi i├žin ayn─▒ de─čeri (veya ayn─▒ de─čere sahip t├╝retilmesi) d├Ând├╝ ANDROID_ID ve TelephonyManager.getDeviceId() - s├╝rece bir Google hesab─▒ kurulumu s─▒ras─▒nda eklenmi┼čtir.
  6. SIM cihaz─▒ olmayan GSM cihazlar─▒n─▒, Google hesab─▒ eklenmemi┼č bir GSM cihaz─▒n─▒ veya u├žak modundaki herhangi bir cihaz─▒ test etme ┼čans─▒m olmad─▒.

Yani cihaz─▒n kendine ├Âzg├╝ bir ┼čey istiyorsan─▒z, yeterli TM.getDeviceId() olmal─▒d─▒r . A├ž─▒k├žas─▒, baz─▒ kullan─▒c─▒lar di─čerlerinden daha paranoyakt─▒r, bu nedenle bu tan─▒mlay─▒c─▒lar─▒n 1 veya daha fazlas─▒na sahip olmak yararl─▒ olabilir, b├Âylece dize hala cihaz i├žin neredeyse benzersizdir, ancak kullan─▒c─▒n─▒n ger├žek cihaz─▒n─▒ a├ž─▒k├ža tan─▒mlamaz. ├ľrne─čin, String.hashCode() bir UUID ile birlikte kullanmak :

 final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

final String tmDevice, tmSerial, androidId;
tmDevice = "" + tm.getDeviceId();
tmSerial = "" + tm.getSimSerialNumber();
androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
String deviceId = deviceUuid.toString();
 

gibi bir ┼čeyle sonu├žlanabilir: 00000000-54b3-e7c7-0000-000046bffd97

Benim i├žin yeterince iyi ├žal─▒┼č─▒yor.

Richard'─▒n da belirtti─či gibi, TelephonyManager ├Âzellikleri okumak i├žin izniniz gerekti─čini unutmay─▒n , bu nedenle bildirinize ┼čunu ekleyin:

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

k├╝t├╝phaneleri i├že aktar

 import android.content.Context;
import android.telephony.TelephonyManager;
import android.view.View;
 

1121


2010-05-17





Son G├╝ncelleme: 06.02.2016


T├╝m Stack Overflow yay─▒nlar─▒n─▒ okuduktan sonra benzersiz bir kimlik, Google geli┼čtirici blogu ve Android dok├╝mantasyonu okuduktan sonra, 'Sahte Kimlik' m├╝mk├╝n olan en iyi se├ženekmi┼č gibi hissediyorum.

Ana Say─▒: Donan─▒m - Yaz─▒l─▒m

Donan─▒m

  • Kullan─▒c─▒lar donan─▒mlar─▒n─▒, Android tabletlerini veya telefonlar─▒n─▒ de─či┼čtirebilir, bu nedenle donan─▒ma dayal─▒ benzersiz kimlikler TRACKING KULLANICILARI i├žin iyi fikirler de─čildir.
  • ─░├žin ─░ZLEME DONANIM , bu harika bir fikir

Yaz─▒l─▒m

  • Kullan─▒c─▒lar k├Âkl├╝ ise ROM'lar─▒n─▒ silebilir / de─či┼čtirebilir
  • Kullan─▒c─▒lar─▒ platformlarda izleyebilirsiniz (iOS, Android, Windows ve Web)
  • En iyi Talep PAR├çA bireysel bir kullan─▒c─▒ kendi ile r─▒zas─▒ basit├že (OAuth kullanarak bu Kesintisiz olun) onlar─▒ giri┼č sahip olmakt─▒r

Android ile genel ar─▒za

- API i├žin garanti benzersizli─či (k├Âkl├╝ ayg─▒tlar dahil)> = 9/10 (Android ayg─▒tlar─▒n% 99,5'i)

- Fazladan izin yok

Psuedo kodu:

 if API >= 9/10: (99.5% of devices)

return unique ID containing serial id (rooted devices may be different)

else

return the unique ID of build information (may overlap data - API < 9)
 

T├╝m se├ženeklerimizi g├Ânderdi─činiz i├žin @stansult'a te┼čekk├╝r ederiz (bu Y─▒─č─▒n Ta┼čmas─▒ sorusunda).

Se├ženeklerin listesi - neden / neden kullan─▒lmamas─▒n─▒n nedenleri:

  • Kullan─▒c─▒ E-postas─▒ - Yaz─▒l─▒m

    • Kullan─▒c─▒ e-postay─▒ de─či┼čtirebilir - Y├ťKSEK ihtimal d─▒┼č─▒
    • API 5+ <uses-permission android:name="android.permission.GET_ACCOUNTS" /> veya
    • API 14+ <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> ( Android cihaz─▒n birincil e-posta adresini nas─▒l elde edilir )
  • Kullan─▒c─▒ Telefon Numaras─▒ - Yaz─▒l─▒m

    • Kullan─▒c─▒lar telefon numaralar─▒n─▒ de─či┼čtirebilirdi - Y├ťKSEK ihtimal d─▒┼č─▒
    • <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  • IMEI - Donan─▒m (sadece telefonlar, ihtiya├žlar android.permission.READ_PHONE_STATE )

    • ├ço─ču kullan─▒c─▒ izinlerinde "Telefon G├Âr├╝┼čmeleri" yazmas─▒ndan nefret eder. Baz─▒ kullan─▒c─▒lar k├Ât├╝ puanlar verir, ├ž├╝nk├╝ ger├žekten yapmak istedi─činiz tek ┼čey cihaz kurulumlar─▒n─▒ takip etmek oldu─čunda ki┼čisel bilgilerini ├žald─▒─č─▒n─▒z─▒ san─▒rlar. Veri toplad─▒─č─▒n─▒z a├ž─▒kt─▒r.
    • <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  • Android Kimli─či - Donan─▒m (bo┼č olabilir, fabrika ayarlar─▒na s─▒f─▒rlama s─▒ras─▒nda de─či┼čebilir, k├Âkl├╝ bir cihazda de─či┼čtirilebilir)

    • 'Bo┼č' olabilece─činden, 'bo┼č' de─čerini kontrol edebilir ve de─čerini de─či┼čtirebiliriz, ancak bu art─▒k benzersiz olmayaca─č─▒ anlam─▒na gelir.
    • Fabrika ayarlar─▒na s─▒f─▒rlama cihaz─▒na sahip bir kullan─▒c─▒n─▒z varsa, de─čer k├Âkl├╝ cihazda de─či┼čmi┼č veya de─či┼čmi┼č olabilir, bu nedenle kullan─▒c─▒ kurulumlar─▒n─▒ izliyorsan─▒z ├žift giri┼čler olabilir.
  • WLAN MAC Adresi - Donan─▒m (ihtiya├žlar android.permission.ACCESS_WIFI_STATE )

    • Bu ikinci en iyi se├ženek olabilir, ancak yine de do─črudan kullan─▒c─▒dan gelen benzersiz bir tan─▒mlay─▒c─▒y─▒ topluyor ve sakl─▒yorsunuz. Bu veri toplad─▒─č─▒n─▒z a├ž─▒kt─▒r.
    • <uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
  • Bluetooth MAC Adresi - Donan─▒m (Bluetooth'lu cihazlar, ihtiya├žlar android.permission.BLUETOOTH )

    • Piyasadaki ├žo─ču uygulama Bluetooth kullanmaz ve bu nedenle uygulaman─▒z Bluetooth kullan─▒yorsa ve bunu dahil ediyorsan─▒z, kullan─▒c─▒ ┼č├╝phelenebilir.
    • <uses-permission android:name="android.permission.BLUETOOTH "/>
  • S├Âzde E┼čsiz Kimlik - Yaz─▒l─▒m (t├╝m Android cihazlar i├žin)

    • ├çok m├╝mk├╝n, ├žarp─▒┼čmalar i├žerebilir - A┼ča─č─▒daki y├Ântemime bak─▒n─▒z!
    • Bu, ├Âzel bir ┼čey almadan kullan─▒c─▒dan 'neredeyse benzersiz' bir kimli─če sahip olman─▒z─▒ sa─člar. Cihaz bilgilerinden kendi ads─▒z kimli─činizi olu┼čturabilirsiniz.

─░zinleri kullanmadan benzersiz bir kimlik alman─▒n 'm├╝kemmel' bir yolu olmad─▒─č─▒n─▒ biliyorum; ancak, bazen yaln─▒zca cihaz─▒n kurulumunu izlememiz gerekir. Benzersiz bir kimlik olu┼čturmaya gelince, yaln─▒zca Android API'nin bize ek izinler almadan bize sundu─ču bilgilere dayanarak bir 'sahte benzersiz kimlik' olu┼čturabiliriz. Bu ┼čekilde, kullan─▒c─▒ya sayg─▒ g├Âsterebilir ve iyi bir kullan─▒c─▒ deneyimi sunmaya ├žal─▒┼čabiliriz.

Sahte benzersiz bir kimli─če sahipseniz, ger├žekten benzer cihazlar─▒n varl─▒─č─▒na dayanan kopyalar─▒n olabilece─či ger├že─čine rastlars─▒n─▒z. Daha benzersiz hale getirmek i├žin birle┼čtirilmi┼č y├Ântemi ince ayar yapabilirsiniz; ancak, baz─▒ geli┼čtiricilerin cihaz kurulumlar─▒n─▒ izlemesi gerekir ve bu, benzer cihazlara dayanarak hile veya performans─▒ ger├žekle┼čtirir.

API> = 9:

Android cihazlar─▒n─▒n API 9 veya ├╝st├╝ olmas─▒ durumunda, 'Build.SERIAL' alan─▒ nedeniyle benzersiz olmas─▒ garanti edilir.

UNUTMAYIN , teknik olarak yaln─▒zca API <9 olan kullan─▒c─▒lar─▒n yakla┼č─▒k% 0.5'ini ka├ž─▒r─▒yorsunuz . Yani gerisine odaklanabilirsiniz: Bu, kullan─▒c─▒lar─▒n% 99,5'idir!

API <9:

Kullan─▒c─▒n─▒n Android cihaz─▒ API 9'dan d├╝┼č├╝kse; umar─▒m fabrika ayarlar─▒na s─▒f─▒rlama yapmazlar ve 'Secure.ANDROID_ID' de─čerleri korunurlar veya 'null' olmazlar. (bkz. http://developer.android.com/about/dashboards/index.html )

E─čer hepsi hataysa:

Di─čerleri ba┼čar─▒s─▒z olursa, kullan─▒c─▒ API 9'dan daha d├╝┼č├╝kse (Gingerbread'ten d├╝┼č├╝k), cihaz─▒n─▒ s─▒f─▒rlad─▒ysa veya 'Secure.ANDROID_ID' de─čeri 'null' verirse, o zaman d├Ând├╝r├╝len kimlik yaln─▒zca Android cihaz bilgilerine dayan─▒r. ├çarp─▒┼čmalar─▒n olabilece─či yer buras─▒d─▒r.

de─či┼čiklikler:

  • Fabrika ayarlar─▒na s─▒f─▒rlama nedeniyle 'Android.SECURE_ID' kald─▒r─▒ld─▒ de─čerin de─či┼čmesine neden olabilir
  • APIÔÇÖde de─či┼čtirilecek kod d├╝zenlendi
  • S├Âzde De─či┼čti

L├╝tfen a┼ča─č─▒daki y├Ânteme bir g├Âz at─▒n:

 /**
 * Return pseudo unique ID
 * @return ID
 */
public static String getUniquePsuedoID() {
    // If all else fails, if the user does have lower than API 9 (lower
    // than Gingerbread), has reset their device or 'Secure.ANDROID_ID'
    // returns 'null', then simply the ID returned will be solely based
    // off their Android device information. This is where the collisions
    // can happen.
    // Thanks http://www.pocketmagic.net/?p=1662!
    // Try not to use DISPLAY, HOST or ID - these items could change.
    // If there are collisions, there will be overlapping data
    String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);

    // Thanks to @Roman SL!
    // https://stackoverflow.com/a/4789483/950427
    // Only devices with API >= 9 have android.os.Build.SERIAL
    // http://developer.android.com/reference/android/os/Build.html#SERIAL
    // If a user upgrades software or roots their device, there will be a duplicate entry
    String serial = null;
    try {
        serial = android.os.Build.class.getField("SERIAL").get(null).toString();

        // Go ahead and return the serial for api => 9
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    } catch (Exception exception) {
        // String needs to be initialized
        serial = "serial"; // some value
    }

    // Thanks @Joe!
    // https://stackoverflow.com/a/2853253/950427
    // Finally, combine the values we have found by using the UUID class to create a unique identifier
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
 

Yeni (reklamlar ve Google Play Servisleri olan uygulamalar i├žin):

Google Play Geli┼čtirici konsolundan:

1 A─čustos 2014'ten itibaren, Google Play Geli┼čtirici Program─▒ Politikas─▒, reklam kimli─čini, herhangi bir reklam ama├žl─▒ di─čer kal─▒c─▒ tan─▒mlay─▒c─▒lar yerine kullanmak i├žin t├╝m yeni uygulama y├╝klemelerini ve g├╝ncellemeleri gerektirir. Daha fazla bilgi edin

Uygulama :

─░zin:

 <uses-permission android:name="android.permission.INTERNET" />
 

Kod:

 import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;
import com.google.android.gms.common.GooglePlayServicesAvailabilityException;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import java.io.IOException;
...

// Do not call this function from the main thread. Otherwise, 
// an IllegalStateException will be thrown.
public void getIdThread() {

  Info adInfo = null;
  try {
    adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);

  } catch (IOException exception) {
    // Unrecoverable error connecting to Google Play services (e.g.,
    // the old version of the service doesn't support getting AdvertisingId).

  } catch (GooglePlayServicesAvailabilityException exception) {
    // Encountered a recoverable error connecting to Google Play services. 

  } catch (GooglePlayServicesNotAvailableException exception) {
    // Google Play services is not available entirely.
  }
  final String id = adInfo.getId();
  final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
}
 

Kaynak / Dok├╝manlar:

http://developer.android.com/google/play-services/id.html http://developer.android.com/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html

├ľnemli:

Reklam kimli─činin, Google Play Hizmetleri kullan─▒labilir oldu─čunda, reklam ama├žl─▒ di─čer tan─▒mlay─▒c─▒lar─▒n (├Ârne─čin, AyarlarÔÇÖdaki ANDROID_ID kullan─▒m─▒ gibi) mevcut kullan─▒m─▒n─▒ tamamen de─či┼čtirmesi ama├žlanm─▒┼čt─▒r. Google Play Hizmetlerinin kullan─▒lamad─▒─č─▒ durumlarda, GetAdvertisingIdInfo () taraf─▒ndan at─▒lan bir GooglePlayServicesNotAvailableException belirtilir.

Uyar─▒, kullan─▒c─▒lar s─▒f─▒rlayabilir:

http://en.kioskea.net/faq/34732-android-reset-your-advertising-id

Bilgi ald─▒─č─▒m her linke referans vermeye ├žal─▒┼čt─▒m. E─čer eksikseniz ve dahil edilmeniz gerekiyorsa, l├╝tfen yorum yap─▒n!

Google Player Hizmetleri ├ľrnek Kimli─či

https://developers.google.com/instance-id/


420







Dave Webb'in dedi─či gibi, Android Geli┼čtirici Blogunda bunu kapsayan bir makale var. Tercih ettikleri ├ž├Âz├╝m, ayg─▒tlardan ziyade uygulama y├╝klemelerini izlemektir ve ├žo─ču kullan─▒m durumunda i┼če yarayacakt─▒r. Blog yaz─▒s─▒, bu ├žal─▒┼čmay─▒ yapman─▒z i├žin gereken kodu size g├Âsterir ve incelemenizi ├Âneririm.

Ancak, blog uygulamas─▒, bir uygulama y├╝kleme tan─▒mlay─▒c─▒s─▒ yerine bir cihaz tan─▒mlay─▒c─▒s─▒na ihtiyac─▒n─▒z varsa ├ž├Âz├╝mleri tart─▒┼čmaya devam eder. Yapman─▒z gereken bir ka├ž maddeyle ilgili ek a├ž─▒klamalar almak i├žin GoogleÔÇÖda birisiyle konu┼čtum. Yukar─▒da belirtilen blog g├Ânderiminde bahsedilmeyen cihaz tan─▒mlay─▒c─▒lar─▒ hakk─▒nda ke┼čfettiklerim:

  • ANDROID_ID, tercih edilen cihaz tan─▒mlay─▒c─▒s─▒d─▒r. ANDROID_ID, Android <= 2.1 veya> = 2.3 s├╝r├╝mlerinde tamamen g├╝venilirdir. G├Ânderide sadece 2,2 ile belirtilen sorunlar var.
  • Birka├ž ├╝reticinin yapt─▒─č─▒ bir├žok cihaz 2.2'deki ANDROID_ID hatalar─▒ndan etkilenir.
  • Belirleyebildi─čim kadar─▒yla, etkilenen t├╝m cihazlar 9774d56d682e549c olan ayn─▒ ANDROID_ID de─čerine sahip . Ayr─▒ca em├╝lat├Âr taraf─▒ndan bildirilen ayn─▒ cihaz kimli─čidir, btw.
  • Google, OEMÔÇÖlerin bu sorunu cihazlar─▒n─▒n bir├žo─čuna veya bir├žo─čuna yatt─▒─č─▒na inanmaktad─▒r, ancak Nisan 2011ÔÇÖin ba┼č─▒ndan itibaren en az─▒ndan k─▒r─▒lm─▒┼č ANDROID_IDÔÇÖe sahip cihazlar─▒ bulmakta olduk├ža kolay oldu─čunu do─črulayabildim.

GoogleÔÇÖ─▒n tavsiyelerine dayanarak, her cihaz i├žin, gerekti─činde tohum olarak ANDROID_IDÔÇÖyi kullanarak, gerekti─činde TelephonyManager.getDeviceId () y├Ântemine geri d├Ânerek ve ba┼čar─▒s─▒z olursa, rastgele olu┼čturulmu┼č benzersiz bir UUIDÔÇÖye ba┼čvurarak, her cihaz i├žin benzersiz bir UUID ├╝retecek bir s─▒n─▒f uygulad─▒m. Bu, uygulama yeniden ba┼člatmalar─▒ aras─▒nda kal─▒c─▒d─▒r (ancak uygulama yeniden y├╝klemeleri de─čil).

Cihaz numaras─▒ son ├žare olarak gereken cihazlar i├žin, benzersiz kimlik o Not OLACAK fabrika s─▒f─▒rlama aras─▒nda varl─▒─č─▒n─▒. Bu fark─▒nda olmak bir ┼čey. Fabrika ayarlar─▒na s─▒f─▒rlama i┼čleminin benzersiz kimli─činizi s─▒f─▒rlayaca─č─▒ndan emin olman─▒z gerekirse, cihaz kimli─či yerine do─črudan rastgele UUID'ye d├╝┼čmeyi d├╝┼č├╝nebilirsiniz.

Yine, bu kod bir uygulama y├╝kleme kimli─či i├žin de─čil, bir cihaz kimli─či i├žindir. ├ço─ču durumda, bir uygulama y├╝kleme kimli─či muhtemelen arad─▒─č─▒n─▒z ┼čeydir. Ancak bir cihaz kimli─čine ihtiyac─▒n─▒z varsa, a┼ča─č─▒daki kod muhtemelen sizin i├žin ├žal─▒┼čacakt─▒r.

 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 volatile 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;
    }
}
 

334







Reto MeierÔÇÖin bu y─▒l Google I / O sunumunda kullan─▒c─▒ i├žin benzersiz bir kimlik almak i├žin kulland─▒─č─▒ kod :

 private static String uniqueID = null;
private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";

public synchronized static String id(Context context) {
    if (uniqueID == null) {
        SharedPreferences sharedPrefs = context.getSharedPreferences(
                PREF_UNIQUE_ID, Context.MODE_PRIVATE);
        uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
        if (uniqueID == null) {
            uniqueID = UUID.randomUUID().toString();
            Editor editor = sharedPrefs.edit();
            editor.putString(PREF_UNIQUE_ID, uniqueID);
            editor.commit();
        }
    }
    return uniqueID;
}
 

Bunu buluta tercihler g├Ândermek i├žin bir yedekleme stratejisiyle birle┼čtirirseniz (Reto'nun konu┼čmas─▒nda da a├ž─▒kland─▒─č─▒ gibi , bir kullan─▒c─▒yla ba─člant─▒ kuran ve cihaz silindikten sonra bile tak─▒l─▒p kalabilecek bir kimli─činiz olmal─▒d─▒r. Bunu kullanmay─▒ d├╝┼č├╝n├╝yorum. analitikte ileriye do─čru gidiyor (ba┼čka bir deyi┼čle, hen├╝z o ┼čeyi yapmad─▒m :).


176







Ayr─▒ca Wi-Fi adapt├Âr├╝n├╝n MAC adresini de d├╝┼č├╝nebilirsiniz. Bu ┼čekilde al─▒nd─▒:

 WifiManager wm = (WifiManager)Ctxt.getSystemService(Context.WIFI_SERVICE);
return wm.getConnectionInfo().getMacAddress();
 

Bildirimde izin al─▒nmas─▒ gerekir android.permission.ACCESS_WIFI_STATE .

Wi-Fi ba─čl─▒ olmasa bile kullan─▒labilece─či bildirildi. Yukar─▒daki cevaba g├Âre Joe bunu bir ├žok cihaz─▒nda denerse, bu iyi olurdu.

Baz─▒ cihazlarda, Wi-Fi kapal─▒ oldu─čunda kullan─▒lamaz.

NOT: Android 6.x'ten tutarl─▒ sahte mac adresi d├Ând├╝r├╝r: 02:00:00:00:00:00


102







Burada olduk├ža yararl─▒ bilgiler var .

Be┼č farkl─▒ kimlik tipini kapsar:

  1. IMEI (yaln─▒zca Telefon kullan─▒m─▒ olan Android cihazlar i├žin; ihtiya├žlar android.permission.READ_PHONE_STATE )
  2. S├Âzde E┼čsiz Kimlik (t├╝m Android cihazlar i├žin)
  3. Android kimli─či (bo┼č olabilir, fabrika ayarlar─▒na s─▒f─▒rlama s─▒ras─▒nda de─či┼čebilir, k├Âkl├╝ telefonda de─či┼čtirilebilir)
  4. WLAN MAC Adres dizesi (ihtiya├žlar android.permission.ACCESS_WIFI_STATE )
  5. BT MAC Adres dizesi (Bluetooth'lu cihazlar, ihtiya├žlar android.permission.BLUETOOTH )

84







Resmi Android Geli┼čtiricileri Blogu ┼čimdi bu konuyla ilgili, Uygulama Kurulumlar─▒n─▒ Tan─▒mlayan tam bir makaleye sahip .


49


2011-04-06





At Google I / O Reto Meier kurulumlar─▒ aras─▒nda kullan─▒c─▒lar─▒ izlemek i├žin ├žo─ču geli┼čtirici ihtiya├žlar─▒n─▒ kar┼č─▒lamak gereken bu yakla┼č─▒m nas─▒l sa─člam bir cevap yay─▒nlad─▒. Anthony Nolan cevab─▒ndaki y├Ân├╝ g├Âsteriyor, ama ba┼čkalar─▒n─▒n nas─▒l yap─▒laca─č─▒n─▒ kolayca g├Ârebilmeleri i├žin b├╝t├╝n yakla┼č─▒m─▒ yazaca─č─▒m─▒ d├╝┼č├╝nd├╝m (detaylar─▒ anlamak biraz zaman ald─▒).

Bu yakla┼č─▒m, size farkl─▒ cihazlar aras─▒nda (birincil Google hesab─▒na ba─čl─▒ olarak) ve kurulumlar s─▒ras─▒nda kal─▒c─▒ olacak, anonim, g├╝venli bir kullan─▒c─▒ kimli─či verecektir. Temel yakla┼č─▒m rastgele bir kullan─▒c─▒ kimli─či olu┼čturmak ve bunu uygulamalar─▒n ortak tercihlerinde saklamakt─▒r. Ard─▒ndan, Google hesab─▒na ba─čl─▒ payla┼č─▒lan tercihleri ÔÇőÔÇőbulutta depolamak i├žin Google'─▒n yedekleme arac─▒s─▒n─▒ kullan─▒n.

T├╝m yakla┼č─▒m─▒ g├Âzden ge├žirelim. ├ľncelikle, Android Yedekleme Hizmetini kullanarak SharedPreferences i├žin bir yedek olu┼čturmam─▒z gerekiyor. Uygulaman─▒z─▒ ├╝zerinden kaydettirerek ba┼člay─▒n http://developer.android.com/google/backup/signup.html .

Google, bildirime eklemeniz gereken bir yedekleme hizmeti anahtar─▒ verecektir. Uygulamaya, BackupAgent'─▒ a┼ča─č─▒daki gibi kullanmas─▒n─▒ da s├Âylemeniz gerekir:

 <application android:label="MyApplication"
         android:backupAgent="MyBackupAgent">
    ...
    <meta-data android:name="com.google.android.backup.api_key"
        android:value="your_backup_service_key" />
</application>
 

Ard─▒ndan, yedekleme arac─▒s─▒n─▒ olu┼čturman─▒z ve yard─▒mc─▒ arac─▒y─▒ payla┼č─▒lan tercihler i├žin kullanmas─▒n─▒ istemeniz gerekir:

 public class MyBackupAgent extends BackupAgentHelper {
    // The name of the SharedPreferences file
    static final String PREFS = "user_preferences";

    // A key to uniquely identify the set of backup data
    static final String PREFS_BACKUP_KEY = "prefs";

    // Allocate a helper and add it to the backup agent
    @Override
    public void onCreate() {
        SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this,          PREFS);
        addHelper(PREFS_BACKUP_KEY, helper);
    }
}
 

Yedeklemeyi tamamlamak i├žin ana etkinli─činizde bir BackupManager ├Ârne─či olu┼čturman─▒z gerekir:

 BackupManager backupManager = new BackupManager(context);
 

Sonunda mevcut de─čilse, bir kullan─▒c─▒ kimli─či olu┼čturun ve SharedPreferences'ta saklay─▒n:

   public static String getUserID(Context context) {
            private static String uniqueID = null;
        private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    if (uniqueID == null) {
        SharedPreferences sharedPrefs = context.getSharedPreferences(
                MyBackupAgent.PREFS, Context.MODE_PRIVATE);
        uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
        if (uniqueID == null) {
            uniqueID = UUID.randomUUID().toString();
            Editor editor = sharedPrefs.edit();
            editor.putString(PREF_UNIQUE_ID, uniqueID);
            editor.commit();

            //backup the changes
            BackupManager mBackupManager = new BackupManager(context);
            mBackupManager.dataChanged();
        }
    }

    return uniqueID;
}
 

Bu User_ID, kullan─▒c─▒ cihaz─▒ ta┼č─▒mas─▒na ra─čmen kurulumlar aras─▒nda kal─▒c─▒ olacakt─▒r.

Bu yakla┼č─▒m hakk─▒nda daha fazla bilgi i├žin Reto'nun konu┼čmas─▒na bak─▒n .

Ve yedekleme arac─▒s─▒n─▒ nas─▒l uygulayaca─č─▒n─▒zla ilgili t├╝m ayr─▒nt─▒lar i├žin, bkz. Veri Yedekleme . Yedeklemenin an─▒nda ger├žekle┼čmemesi ve test etmek i├žin yedeklemeyi zorlaman─▒z gerekti─činden testin en alt k─▒sm─▒ndaki b├Âl├╝mlerini ├Âzellikle tavsiye ediyorum.


41







Bunun kesin bir kimlik i├žin iskelet in┼ča etmenin ate┼č yolu oldu─čuna eminim ... bir g├Âz at─▒n.

T├╝m Android cihazlarda ├žal─▒┼čan S├Âzde E┼čsiz Kimlik, baz─▒ cihazlarda telefon yoktur (├Ârne─čin, Tabletler) veya herhangi bir nedenle, READ_PHONE_STATE iznini dahil etmek istemezsiniz. ID'yi bir seri anahtar kontrol├╝ veya ba┼čka genel ama├žlar i├žin kullanmak isterseniz, ROM S├╝r├╝m├╝, ├ťretici ad─▒, CPU tipi ve di─čer donan─▒m detaylar─▒ gibi bilgileri yine de okuyabilirsiniz. Bu ┼čekilde hesaplanan kimlik benzersiz olmayacakt─▒r: ayn─▒ kimli─če sahip (ayn─▒ donan─▒m ve ROM g├Âr├╝nt├╝s├╝ne ba─čl─▒ olarak) iki ayg─▒t bulmak m├╝mk├╝nd├╝r, ancak ger├žek d├╝nya uygulamalar─▒ndaki de─či┼čiklikler ├Ânemsizdir. Bu ama├ž i├žin Build s─▒n─▒f─▒n─▒ kullanabilirsiniz:

 String m_szDevIDShort = "35" + //we make this look like a valid IMEI
            Build.BOARD.length()%10+ Build.BRAND.length()%10 +
            Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
            Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
            Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
            Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
            Build.TAGS.length()%10 + Build.TYPE.length()%10 +
            Build.USER.length()%10 ; //13 digits
 

Yap─▒ ├╝yelerinin ├žo─ču dizgedir, burada yapt─▒─č─▒m─▒z ┼čey onlar─▒n uzunlu─čunu almak ve bunu bir rakam cinsinden modulo arac─▒l─▒─č─▒yla d├Ân├╝┼čt├╝rmektir. Bu t├╝r 13 haneye sahibiz ve IMEI ile ayn─▒ b├╝y├╝kl├╝kteki ID'ye (15 basamak) sahip olmak i├žin ├Ân├╝ne iki tane daha (35) ekliyoruz. Burada ba┼čka olas─▒l─▒klar da var, sadece bu iplere bir bak─▒n. Gibi bir ┼čey d├Ând├╝r├╝r 355715565309247 . ├ľzel bir izne gerek yok, bu yakla┼č─▒m─▒ ├žok kolayla┼čt─▒r─▒yor.


(Ekstra bilgi: Yukar─▒da verilen teknik Pocket Magic'teki bir makaleden kopyalanm─▒┼čt─▒r .)


37







A┼ča─č─▒daki kod, gizli bir Android API kullanarak cihaz─▒n seri numaras─▒n─▒ d├Ând├╝r├╝r. Ancak, "ro.serialno" bu cihazda ayarlanmad─▒─č─▒ndan, bu kod Samsung Galaxy Tab'ta ├žal─▒┼čmaz.

 String serial = null;

try {
    Class<?> c = Class.forName("android.os.SystemProperties");
    Method get = c.getMethod("get", String.class);
    serial = (String) get.invoke(c, "ro.serialno");
}
catch (Exception ignored) {

}
 

35







A┼ča─č─▒daki kodu kullanarak, bir Android i┼čletim sistemi cihaz─▒n─▒n benzersiz cihaz kimli─čini bir dize olarak alabilirsiniz.

 deviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
 

24







API seviyesi 9'daki (Android 2.3 - Gingerbread) s─▒n─▒fa bir Seri alan─▒ eklendi Build . Belgeler, donan─▒m─▒n seri numaras─▒n─▒ temsil etti─čini s├Âyl├╝yor. Bu nedenle e─čer cihazda mevcutsa, benzersiz olmas─▒ gerekir.

API seviyesi> = 9 olan t├╝m cihazlar taraf─▒ndan ger├žekten desteklenip desteklenmedi─čini (= null de─čil) bilmiyorum.


19







Ekleyece─čim tek ┼čey - Bu e┼čsiz durumlardan birine sahibim.

Kullan─▒m─▒:

 deviceId = Secure.getString(this.getContext().getContentResolver(), Secure.ANDROID_ID);
 

Viewsonic G Tablet'im Null olmayan bir DeviceID rapor etse de, her G Tabletin ayn─▒ say─▒y─▒ rapor etti─čini bildirir.

"Benzersiz" DeviceID'yi temel alan birisinin hesab─▒na an─▒nda eri┼čmenizi sa─člayan "Cep Empires" oyununu ilgin├ž k─▒lar.

Cihaz─▒m─▒n h├╝cre radyosu yok.


16







Uygulaman─▒z─▒n y├╝klendi─či her Android cihaz i├žin benzersiz bir tan─▒mlay─▒c─▒ nas─▒l edinilece─čine ili┼čkin ayr─▒nt─▒l─▒ talimatlar i├žin, Uygulama Y├╝klemelerini Tan─▒mlama adl─▒ resmi Android Geli┼čtiricileri Blogu'na bak─▒n .

Kurulum s─▒ras─▒nda kendiniz bir tane ├╝retmeniz ve daha sonra uygulama yeniden ba┼člat─▒ld─▒─č─▒nda okumas─▒ en iyi yol gibi g├Âr├╝n├╝yor.

Ben ┼čahsen bunu kabul edilebilir buluyorum ama ideal de─čil. Android taraf─▒ndan sa─članan hi├žbir tan─▒mlay─▒c─▒, telefonun radyo durumlar─▒na (Wi-Fi a├ž─▒k / kapal─▒, h├╝cresel a├ž─▒k / kapal─▒, Bluetooth a├ž─▒k / kapal─▒) ba─čl─▒ oldu─ču gibi t├╝m durumlarda ├žal─▒┼čmaz. Di─čerleri Settings.Secure.ANDROID_ID ├╝retici taraf─▒ndan uygulanmal─▒ ve benzersiz olmalar─▒ garanti edilmemelidir.

A┼ča─č─▒dakiler, uygulaman─▒n yerel olarak kaydetti─či di─čer verilerle birlikte saklanacak olan bir y├╝kleme dosyas─▒na veri yazma ├Ârne─čidir .

 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();
    }
}
 

15







S─▒n─▒f dosyas─▒na a┼ča─č─▒daki kodu ekleyin:

 final TelephonyManager tm = (TelephonyManager) getBaseContext()
            .getSystemService(SplashActivity.TELEPHONY_SERVICE);
    final String tmDevice, tmSerial, androidId;
    tmDevice = "" + tm.getDeviceId();
    Log.v("DeviceIMEI", "" + tmDevice);
    tmSerial = "" + tm.getSimSerialNumber();
    Log.v("GSM devices Serial Number[simcard] ", "" + tmSerial);
    androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(),
            android.provider.Settings.Secure.ANDROID_ID);
    Log.v("androidId CDMA devices", "" + androidId);
    UUID deviceUuid = new UUID(androidId.hashCode(),
            ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());
    String deviceId = deviceUuid.toString();
    Log.v("deviceIdUUID universally unique identifier", "" + deviceId);
    String deviceModelName = android.os.Build.MODEL;
    Log.v("Model Name", "" + deviceModelName);
    String deviceUSER = android.os.Build.USER;
    Log.v("Name USER", "" + deviceUSER);
    String devicePRODUCT = android.os.Build.PRODUCT;
    Log.v("PRODUCT", "" + devicePRODUCT);
    String deviceHARDWARE = android.os.Build.HARDWARE;
    Log.v("HARDWARE", "" + deviceHARDWARE);
    String deviceBRAND = android.os.Build.BRAND;
    Log.v("BRAND", "" + deviceBRAND);
    String myVersion = android.os.Build.VERSION.RELEASE;
    Log.v("VERSION.RELEASE", "" + myVersion);
    int sdkVersion = android.os.Build.VERSION.SDK_INT;
    Log.v("VERSION.SDK_INT", "" + sdkVersion);
 

AndroidManifest.xml dosyas─▒na ekleyin:

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

10







Kullanarak TelephonyManager ve kullanarak, bir Android i┼čletim sistemi ayg─▒t─▒n─▒n String olarak benzersiz ayg─▒t kimli─či ANDROID_ID :

 String deviceId;
final TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null) {
    deviceId = mTelephony.getDeviceId();
}
else {
    deviceId = Secure.getString(
                   getApplicationContext().getContentResolver(),
                   Secure.ANDROID_ID);
}
 

Ancak Google taraf─▒ndan ├Ânerilen bir y├Ântemi ┼čiddetle tavsiye ediyorum, bkz . Uygulama Y├╝klemelerini Tan─▒mlama .


9







Art─▒lar─▒ ve eksileri ile bu ANDROID_ID sorunlar─▒n ├ž├Âz├╝m├╝ i├žin bir├žok farkl─▒ yakla┼č─▒m vard─▒r ( null bazen veya belirli bir modelin cihazlar─▒ her zaman ayn─▒ kimli─či verir):

  • ├ľzel bir kimlik olu┼čturma algoritmas─▒ uygulamak (statik olmas─▒ beklenen ve de─či┼čmeyecek olan cihaz ├Âzelliklerine g├Âre -> kim bilir)
  • IMEI , seri numaras─▒, Wi-Fi / Bluetooth-MAC adresi gibi di─čer kimlik numaralar─▒n─▒ k├Ât├╝ye kullanma (t├╝m cihazlarda bulunmayacak veya ek izin gerekli olabilir)

Kendimi Android i├žin mevcut bir OpenUDID uygulamas─▒n─▒ (bkz. Https://github.com/ylechelle/OpenUDID ) kullanmay─▒ tercih ediyorum (bkz. Https://github.com/vieux/OpenUDID ). Entegrasyonu kolayd─▒r ve ANDROID_ID yukar─▒da belirtilen sorunlar i├žin geri d├Ân├╝┼člerle birlikte faydalan─▒r .


8







Burada 30'dan fazla cevap var ve baz─▒lar─▒ ayn─▒, baz─▒lar─▒ benzersiz. Bu cevap, bu cevaplar─▒n birka├ž─▒na dayanmaktad─▒r. Bunlardan biri @Lenn Dolling'in cevab─▒.

3 kimli─či birle┼čtirir ve 32 basamakl─▒ alt─▒gen bir dize olu┼čturur. Benim i├žin ├žok iyi ├žal─▒┼čt─▒.

3
Kimlik : S├Âzde Kimlik - Fiziksel cihaz ├Âzelliklerine g├Âre ├╝retilir.
ANDROID_ID - Settings.Secure.ANDROID_ID
Bluetooth Adresi - Bluetooth adapt├Âr adresi

Bunun gibi bir ┼čey d├Ând├╝r├╝r: 551F27C060712A72730B0A0F734064B1

Not: Dizeye her zaman daha fazla kimlik ekleyebilirsiniz longId . ├ľrne─čin, Seri #. wifi adapt├Âr adresi. IMEI. Bu ┼čekilde cihaz ba┼č─▒na daha benzersiz hale getirirsiniz.

 @SuppressWarnings("deprecation")
@SuppressLint("HardwareIds")
public static String generateDeviceIdentifier(Context context) {

        String pseudoId = "35" +
                Build.BOARD.length() % 10 +
                Build.BRAND.length() % 10 +
                Build.CPU_ABI.length() % 10 +
                Build.DEVICE.length() % 10 +
                Build.DISPLAY.length() % 10 +
                Build.HOST.length() % 10 +
                Build.ID.length() % 10 +
                Build.MANUFACTURER.length() % 10 +
                Build.MODEL.length() % 10 +
                Build.PRODUCT.length() % 10 +
                Build.TAGS.length() % 10 +
                Build.TYPE.length() % 10 +
                Build.USER.length() % 10;

        String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        String btId = "";

        if (bluetoothAdapter != null) {
            btId = bluetoothAdapter.getAddress();
        }

        String longId = pseudoId + androidId + btId;

        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(longId.getBytes(), 0, longId.length());

            // get md5 bytes
            byte md5Bytes[] = messageDigest.digest();

            // creating a hex string
            String identifier = "";

            for (byte md5Byte : md5Bytes) {
                int b = (0xFF & md5Byte);

                // if it is a single digit, make sure it have 0 in front (proper padding)
                if (b <= 0xF) {
                    identifier += "0";
                }

                // add number to string
                identifier += Integer.toHexString(b);
            }

            // hex string to uppercase
            identifier = identifier.toUpperCase();
            return identifier;
        } catch (Exception e) {
            Log.e("TAG", e.toString());
        }
        return "";
}
 

8







Peki IMEI . Bu Android veya di─čer mobil cihazlar i├žin benzersizdir.


7







─░┼čte benzersiz kimli─či nas─▒l olu┼čturuyorum:

 public static String getDeviceId(Context ctx)
{
    TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);

    String tmDevice = tm.getDeviceId();
    String androidId = Secure.getString(ctx.getContentResolver(), Secure.ANDROID_ID);
    String serial = null;
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) serial = Build.SERIAL;

    if(tmDevice != null) return "01" + tmDevice;
    if(androidId != null) return "02" + androidId;
    if(serial != null) return "03" + serial;
    // other alternatives (i.e. Wi-Fi MAC, Bluetooth MAC, etc.)

    return null;
}
 

7







Benim iki kuru┼č - NB bu bir cihaz (err) benzersiz bir kimli─či i├žindir - Android geli┼čtiricilerin blogunda tart─▒┼č─▒ld─▒─č─▒ gibi de─čil .

@ Emmby taraf─▒ndan sa─članan ├ž├Âz├╝m├╝n SharedPreferences i┼člemler aras─▒nda senkronize edilmedi─činden, her uygulama kimli─čine geri d├Ând├╝─č├╝n├╝ unutmay─▒n ( buraya ve buraya bak─▒n ). Bu y├╝zden bundan tamamen ka├ž─▒nd─▒m.

Bunun yerine, bir enumda bir (ayg─▒t) kimli─či almak i├žin ├že┼čitli stratejiler i├žerdim - enum sabitlerinin s─▒ras─▒n─▒ de─či┼čtirmek, kimli─či elde etmenin ├že┼čitli yollar─▒n─▒n ├Ânceli─čini etkiler. ─░lk bo┼č olmayan kimlik d├Ând├╝r├╝l├╝r veya bir istisna at─▒l─▒r (iyi Java uygulamalar─▒na g├Âre bo┼č de─čer vermemek). Mesela ilk ├Ânce TELEPHONY'e sahibim - ama iyi bir varsay─▒lan se├žim ANDROID_ID beta olacakt─▒r:

 import android.Manifest.permission;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.util.Log;

// TODO : hash
public final class DeviceIdentifier {

    private DeviceIdentifier() {}

    /** @see http://code.google.com/p/android/issues/detail?id=10603 */
    private static final String ANDROID_ID_BUG_MSG = "The device suffers from "
        + "the Android ID bug - its ID is the emulator ID : "
        + IDs.BUGGY_ANDROID_ID;
    private static volatile String uuid; // volatile needed - see EJ item 71
    // need lazy initialization to get a context

    /**
     * Returns a unique identifier for this device. The first (in the order the
     * enums constants as defined in the IDs enum) non null identifier is
     * returned or a DeviceIDException is thrown. A DeviceIDException is also
     * thrown if ignoreBuggyAndroidID is false and the device has the Android ID
     * bug
     *
     * @param ctx
     *            an Android constant (to retrieve system services)
     * @param ignoreBuggyAndroidID
     *            if false, on a device with the android ID bug, the buggy
     *            android ID is not returned instead a DeviceIDException is
     *            thrown
     * @return a *device* ID - null is never returned, instead a
     *         DeviceIDException is thrown
     * @throws DeviceIDException
     *             if none of the enum methods manages to return a device ID
     */
    public static String getDeviceIdentifier(Context ctx,
            boolean ignoreBuggyAndroidID) throws DeviceIDException {
        String result = uuid;
        if (result == null) {
            synchronized (DeviceIdentifier.class) {
                result = uuid;
                if (result == null) {
                    for (IDs id : IDs.values()) {
                        try {
                            result = uuid = id.getId(ctx);
                        } catch (DeviceIDNotUniqueException e) {
                            if (!ignoreBuggyAndroidID)
                                throw new DeviceIDException(e);
                        }
                        if (result != null) return result;
                    }
                    throw new DeviceIDException();
                }
            }
        }
        return result;
    }

    private static enum IDs {
        TELEPHONY_ID {

            @Override
            String getId(Context ctx) {
                // TODO : add a SIM based mechanism ? tm.getSimSerialNumber();
                final TelephonyManager tm = (TelephonyManager) ctx
                        .getSystemService(Context.TELEPHONY_SERVICE);
                if (tm == null) {
                    w("Telephony Manager not available");
                    return null;
                }
                assertPermission(ctx, permission.READ_PHONE_STATE);
                return tm.getDeviceId();
            }
        },
        ANDROID_ID {

            @Override
            String getId(Context ctx) throws DeviceIDException {
                // no permission needed !
                final String andoidId = Secure.getString(
                    ctx.getContentResolver(),
                    android.provider.Settings.Secure.ANDROID_ID);
                if (BUGGY_ANDROID_ID.equals(andoidId)) {
                    e(ANDROID_ID_BUG_MSG);
                    throw new DeviceIDNotUniqueException();
                }
                return andoidId;
            }
        },
        WIFI_MAC {

            @Override
            String getId(Context ctx) {
                WifiManager wm = (WifiManager) ctx
                        .getSystemService(Context.WIFI_SERVICE);
                if (wm == null) {
                    w("Wifi Manager not available");
                    return null;
                }
                assertPermission(ctx, permission.ACCESS_WIFI_STATE); // I guess
                // getMacAddress() has no java doc !!!
                return wm.getConnectionInfo().getMacAddress();
            }
        },
        BLUETOOTH_MAC {

            @Override
            String getId(Context ctx) {
                BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
                if (ba == null) {
                    w("Bluetooth Adapter not available");
                    return null;
                }
                assertPermission(ctx, permission.BLUETOOTH);
                return ba.getAddress();
            }
        }
        // TODO PSEUDO_ID
        // http://www.pocketmagic.net/2011/02/android-unique-device-id/
        ;

        static final String BUGGY_ANDROID_ID = "9774d56d682e549c";
        private final static String TAG = IDs.class.getSimpleName();

        abstract String getId(Context ctx) throws DeviceIDException;

        private static void w(String msg) {
            Log.w(TAG, msg);
        }

        private static void e(String msg) {
            Log.e(TAG, msg);
        }
    }

    private static void assertPermission(Context ctx, String perm) {
        final int checkPermission = ctx.getPackageManager().checkPermission(
            perm, ctx.getPackageName());
        if (checkPermission != PackageManager.PERMISSION_GRANTED) {
            throw new SecurityException("Permission " + perm + " is required");
        }
    }

    // =========================================================================
    // Exceptions
    // =========================================================================
    public static class DeviceIDException extends Exception {

        private static final long serialVersionUID = -8083699995384519417L;
        private static final String NO_ANDROID_ID = "Could not retrieve a "
            + "device ID";

        public DeviceIDException(Throwable throwable) {
            super(NO_ANDROID_ID, throwable);
        }

        public DeviceIDException(String detailMessage) {
            super(detailMessage);
        }

        public DeviceIDException() {
            super(NO_ANDROID_ID);
        }
    }

    public static final class DeviceIDNotUniqueException extends
            DeviceIDException {

        private static final long serialVersionUID = -8940090896069484955L;

        public DeviceIDNotUniqueException() {
            super(ANDROID_ID_BUG_MSG);
        }
    }
}
 

7







Ba┼čka bir yol, /sys/class/android_usb/android0/iSerial herhangi bir ┼čekilde izinsiz bir uygulamada kullanmakt─▒r.

 [email protected]:~$ adb shell ls -l /sys/class/android_usb/android0/iSerial
-rw-r--r-- root     root         4096 2013-01-10 21:08 iSerial
[email protected]:~$ adb shell cat /sys/class/android_usb/android0/iSerial
0A3CXXXXXXXXXX5
 

Bunu Java'da yapmak i├žin, bir iSerial dosyas─▒n─▒ a├žmak ve karakterleri okumak i├žin bir FileInputStream kullan─▒n. Yaln─▒zca bir ├Âzel durum i┼čleyicisine sard─▒─č─▒n─▒zdan emin olun, ├ž├╝nk├╝ t├╝m ayg─▒tlarda bu dosya yoktur.

En az─▒ndan a┼ča─č─▒daki cihazlar─▒n bu dosyay─▒ d├╝nyaca okunabilece─či biliniyor:

  • Galaxy Nexus
  • Nexus S
  • Motorola Xoom 3G
  • Toshiba AT300
  • HTC One V
  • Mini MK802
  • Samsung Galaxy S II

Ayr─▒ca, blog yay─▒n─▒m─▒, Leaking Android donan─▒m seri numaras─▒n─▒, ayr─▒cal─▒kl─▒ uygulamalara da g├Ârebilirsiniz ; bu bilgiler, hangi dosyalar─▒n kullan─▒labilir oldu─čunu tart─▒┼č─▒r.


6







Belirli bir Android cihaz─▒n─▒n donan─▒m tan─▒ma i├žin MAC Adreslerini kontrol edebilirsiniz.

bu ┼čekilde yapabilirsiniz:

AndroidManifest.xml dosyas─▒nda

<uses-permission android:name="android.permission.INTERNET" />

┼čimdi kodunuzda:

 List<NetworkInterface> interfacesList = Collections.list(NetworkInterface.getNetworkInterfaces());

for (NetworkInterface interface : interfacesList) {
   // This will give you the interface MAC ADDRESS
   interface.getHardwareAddress();
}
 

Her Android cihaz─▒nda en az─▒ndan bir "wlan0" dir. Aray├╝z cad─▒s─▒ WI-FI yongas─▒d─▒r. Bu kod WI-FI a├ž─▒k olmasa bile ├žal─▒┼č─▒r.

PS Onlar─▒n MACS i├žeren listeden alacaks─▒n─▒z Di─čer Aray├╝zleri bir demet, ancak bu telefonlar aras─▒nda de─či┼čebilir.


6







IMEI G├╝venli almak veya kullanmak i├žin a┼ča─č─▒daki kodu kullan─▒yorum. ANDROID_ID Alternatif olarak, cihaz telefon ├Âzelliklerine sahip de─čilse:

 String identifier = null;
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE));
if (tm != null)
      identifier = tm.getDeviceId();
if (identifier == null || identifier .length() == 0)
      identifier = Secure.getString(activity.getContentResolver(),Secure.ANDROID_ID);
 

6







Daha spesifik olarak Settings.Secure.ANDROID_ID ,. Bu, cihaz ilk a├ž─▒l─▒┼č─▒nda ├╝retilen ve depolanan 64 bitlik bir miktard─▒r. Cihaz silindi─činde s─▒f─▒rlan─▒r.

ANDROID_ID benzersiz bir cihaz tan─▒mlay─▒c─▒s─▒ i├žin iyi bir se├žim gibi g├Âr├╝n├╝yor. Dezavantajlar─▒ var: Birincisi, 2.2'den ├Ânceki Android s├╝r├╝mlerinde% 100 g├╝venilir de─čil. (ÔÇťFroyoÔÇŁ). Ayr─▒ca, her birinin ayn─▒ ANDROID_ID de─čerine sahip oldu─ču b├╝y├╝k bir ├╝reticiden pop├╝ler bir el cihaz─▒nda en az bir yayg─▒n olarak g├Âzlemlenen bir hata var.


6







TelephonyManger.getDeviceId () E┼čsiz cihaz kimli─čini, ├Ârne─čin GSM i├žin IMEI'yi ve CDMA telefonlar─▒ i├žin MEID veya ESN'yi d├Ând├╝r├╝r.

 final TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);            
String myAndroidDeviceId = mTelephony.getDeviceId(); 
 

Ancak kullanman─▒z─▒ tavsiye ederim:

Android kimli─čini benzersiz bir 64 bit hex dizesi olarak d├Ând├╝ren Settings.Secure.ANDROID_ID .

     String   myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
 

Bazen TelephonyManger.getDeviceId () i┼člevi null de─čerini d├Ând├╝r├╝r, bu nedenle benzersiz bir kimlik bilgisi sa─člamak i├žin bu y├Ântemi kullan─▒rs─▒n─▒z:

 public String getUniqueID(){    
    String myAndroidDeviceId = "";
    TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (mTelephony.getDeviceId() != null){
        myAndroidDeviceId = mTelephony.getDeviceId(); 
    }else{
         myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
    }
    return myAndroidDeviceId;
}
 

5







Google ├ľrnek Kimli─či

I / O 2015'te yay─▒nland─▒; Android'de oyun servisleri 7.5 gerektirir.

https://developers.google.com/instance-id/
https://developers.google.com/instance-id/guides/android-implementation

 InstanceID iid = InstanceID.getInstance( context );   // Google docs are wrong - this requires context
String id = iid.getId();  // blocking call
 

GoogleÔÇÖ─▒n bu kimli─čin Android, Chrome ve iOSÔÇÖdeki kurulumlar─▒ tan─▒mlamak i├žin kullan─▒lmas─▒ niyetinde oldu─ču g├Âr├╝n├╝yor.

Bir cihazdan ziyade bir kurulumu tan─▒mlar, fakat sonra tekrar, ANDROID_ID (kabul edilen cevap olan) art─▒k cihazlar─▒ da tan─▒mlamaz. ARC ├žal─▒┼čma zaman─▒ ile her kurulum i├žin yeni bir ANDROID_ID olu┼čturulur ( buradaki detaylar ), t─▒pk─▒ bu yeni ├Ârnek kimli─či gibi. Ayr─▒ca, kurulumlar─▒ (cihazlar─▒ de─čil) tan─▒mlaman─▒n ├žo─čumuzun arad─▒─č─▒ ┼čey oldu─čunu d├╝┼č├╝n├╝yorum.

├ľrnek kimli─činin avantajlar─▒

Bana ├Âyle geliyor ki, Google bu ama├ž i├žin kullan─▒lmas─▒n─▒ istiyor (kurulumlar─▒n─▒z─▒ tan─▒mlayarak), platformlar aras─▒ ve bir├žok ba┼čka ama├ž i├žin kullan─▒labilir (yukar─▒daki ba─člant─▒lara bak─▒n─▒z).

GCM kullan─▒yorsan─▒z, sonunda bu ├Ârnek kimli─čini kullanman─▒z gerekir, ├ž├╝nk├╝ GCM belirtecini almak i├žin ihtiyac─▒n─▒z olur (eski GCM kay─▒t kimli─činin yerine ge├žer).

Dezavantajlar─▒ / sorunlar─▒

Mevcut uygulamada (GPS 7.5), uygulaman─▒z talep etti─činde, ├Ârnek kimli─či bir sunucudan al─▒n─▒r. Bu, yukar─▒daki ├ža─čr─▒n─▒n engelleyici bir ├ža─čr─▒ oldu─ču anlam─▒na gelir - bilimsel olmayan testlerimde, cihaz─▒n ├ževrimi├ži olmas─▒ durumunda 1-3 saniye, ├ževrim d─▒┼č─▒ysa 0.5 - 1.0 saniye (muhtemelen bu, pes etmeden ve ├╝retmeden ├Ânce ne kadar bekleyece─čidir) rastgele kimlik). Bu Kuzey Amerika'da Nexus 5'te Android 5.1.1 ve GPS 7.5 ile test edildi.

Kimlik numaras─▒n─▒ niyetlendikleri ama├žlar i├žin kullan─▒rsan─▒z - ├Ârne─čin. uygulama kimlik do─črulamas─▒, uygulama kimli─či, GCM - Bu 1-3 saniyenin (elbette uygulaman─▒za ba─čl─▒ olarak) s─▒k─▒nt─▒ olabilece─čini d├╝┼č├╝n├╝yorum.


5


2015-06-19





Android cihaz mac kimli─či de benzersiz bir kimli─či, cihaz─▒n kimli─čini bi├žimlendirmek i├žin kulland─▒─č─▒m─▒zdan emin olmuyor

 WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String address = info.getMacAddress();
 

Ayr─▒ca AndroidManifest.xml dosyas─▒na uygun izinleri eklemeyi de unutmay─▒n.

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 

5







GoogleÔÇÖ─▒n art─▒k bir Reklam Kimli─či var .
Bu da kullan─▒labilir, ancak ┼čunu unutmay─▒n:

Reklam kimli─či, kullan─▒c─▒ya ├Âzel, benzersiz, s─▒f─▒rlanabilir bir kimliktir

ve

kullan─▒c─▒lar─▒n Google Play uygulamalar─▒ndaki tan─▒mlay─▒c─▒lar─▒n─▒ s─▒f─▒rlamas─▒n─▒ veya ilgi alan─▒na dayal─▒ reklamlar─▒ kapsamamas─▒n─▒ sa─člar.

Bu y├╝zden bu kimlik de─či┼čebilse de, yak─▒nda se├žim ┼čans─▒m─▒z olmayacak gibi g├Âr├╝n├╝yor , bu kimli─čin amac─▒na ba─čl─▒.

Daha fazla bilgi @ develper.android

Buraya kopyala-yap─▒┼čt─▒r kodu

HTH


4



─░lgili yay─▒nlar


Yaz─▒l─▒m Klavyesinin Android Ayg─▒t─▒nda G├Âr├╝n├╝r Oldu─čunu Nas─▒l Alg─▒layabilirim?

Swift'de benzersiz bir cihaz kimli─či nas─▒l elde edilir?

─░├žeri─činiz, kimli─či ├Âzniteli─či 'android.R.id.list' olan bir ListView'a sahip olmal─▒

ERROR'a neden olan: ba┼čvurulan tablo i├žin verilen anahtarlarla e┼čle┼čen benzersiz bir k─▒s─▒tlama yok mu?

Android sanal ayg─▒tlar─▒ indirebilece─činiz bir depo var m─▒? [kapal─▒]

RuntimeException: ─░├žeri─činizin kimli─či ├Âzniteli─či 'android.R.id.list' olan bir ListView olmal─▒d─▒r

Eclipse'in Android Cihaz Se├žicisi neden Android cihaz─▒m─▒ g├Âstermiyor?

Python'da benzersiz bir nesne tan─▒mlay─▒c─▒s─▒ var m─▒

Ge├žersiz bir pthread_t kimli─či var m─▒?

Android bildirim kimli─či olarak int benzersiz kimli─či olu┼čturun

Etiketle ilgili di─čer sorular [android]


ArrayList'in bir sat─▒rda ba┼člat─▒lmas─▒

MySQL Datetime s├╝tunu i├žin varsay─▒lan de─čeri nas─▒l belirlersiniz?

Foreach d├Âng├╝s├╝n├╝n ge├žerli yinelemesinin dizinini nas─▒l al─▒rs─▒n─▒z?

Python kullanarak bir dosyay─▒ HTTP ├╝zerinden nas─▒l indirebilirim?

Birden ├žok s─▒n─▒f─▒ kald─▒rma (jQuery)

UITableViewCell, tokatlamak ├╝zerinde sil d├╝─čmesini g├Âster

ASP.NET ├çekirde─činde ├Âzel bir AuthorizeAttribute nas─▒l olu┼čturulur?

MySQL varsay─▒lan karakter k├╝mesini UTC-8 olarak de─či┼čtirin.

Git yerel ve uzak dal ad─▒n─▒ nas─▒l yeniden adland─▒rabilirim?

$ bir nesneyi izle