user3868543
user3868543

Reputation: 573

How to get Advertising ID in android programmatically

I want to get users Advertising ID programmatically.I used the below code from the developer site.But its not working

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

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

          } catch (GooglePlayServicesNotAvailableException e) {
            // Google Play services is not available entirely.
          } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (GooglePlayServicesRepairableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          final String id = adInfo.getId();
          final boolean isLAT = adInfo.isLimitAdTrackingEnabled();

How can I get user's advertising id programmatically ?? please help me

Upvotes: 54

Views: 103891

Answers (13)

Praveen Kumar Verma
Praveen Kumar Verma

Reputation: 3500

Get GAID(Google’s advertising ID)

1. Download latest Google Play Services SDK.
2. Import the code and add it as a library project.
3. Modify AndroidManifest.xml.

<meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

4. Enable ProGuard to shrink and obfuscate your code in project.properties this line

 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

5. Add rules in proguard-project.txt.

     -keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();  }

 -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
        public static final *** NULL;      }
    
    -keepnames @com.google.android.gms.common.annotation.KeepName class *
    -keepclassmembernames class * {
        @com.google.android.gms.common.annotation.KeepName *;
    }
    
    -keepnames class * implements android.os.Parcelable {
        public static final ** CREATOR;
    }

6. Call AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext()).getId() in a worker thread to get the id in String. as like this

        AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            AdvertisingIdClient.Info idInfo = null;
            try {
                idInfo = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
            } catch (GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            } catch (GooglePlayServicesRepairableException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            String advertId = null;
            try{
                advertId = idInfo.getId();
            }catch (Exception e){
                e.printStackTrace();
            }
            return advertId;
        }
        @Override
        protected void onPostExecute(String advertId) {
            Toast.makeText(getApplicationContext(), advertId, Toast.LENGTH_SHORT).show();
        }
    };
    task.execute();

Enjoy!

Upvotes: 20

metvsk
metvsk

Reputation: 349

If you are using Kotlin use this to get the Google Advertising ID of the device

CoroutineScope(Dispatchers.IO).launch {

        var idInfo: AdvertisingIdClient.Info? = null
        try {
            idInfo = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
        } catch (e: GooglePlayServicesNotAvailableException) {
            e.printStackTrace()
        } catch (e: GooglePlayServicesRepairableException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
        var advertId: String? = null
        try {
            advertId = idInfo!!.id
        } catch (e: NullPointerException) {
            e.printStackTrace()
        }
        Log.d(TAG, "onCreate:AD ID $advertId")

    }

Upvotes: 4

muskomsoft
muskomsoft

Reputation: 111

You can call the below function in onCreate(Bundle savedInstanceState) of the activity

and in the logcat search for UIDMY then it will display the id like : I/UIDMY: a1cf5t4e-9eb2-4342-b9dc-10cx1ad1abe1

void getUIDs()
{
    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try {
                AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(SplashScreen.this);
                String myId = adInfo != null ? adInfo.getId() : null;
             
                Log.i("UIDMY", myId);
            } catch (Exception e) {
                Toast toast = Toast.makeText(context, "error occurred ", Toast.LENGTH_SHORT);
                toast.setGravity(gravity, 0,0);
                toast.show();
            }
        }
    });
}

Upvotes: 11

Heath Kornblum
Heath Kornblum

Reputation: 111

The modern way is to use Coroutines in Kotlin, since AsyncTask is now being deprecated for Android. Here is how I did it:

import com.google.android.gms.ads.identifier.AdvertisingIdClient
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

class AdvertisingInfo(val context: Context) {

    private val adInfo = AdvertisingIdClient(context.applicationContext)

    suspend fun getAdvertisingId(): String =
        withContext(Dispatchers.IO) {
            //Connect with start(), disconnect with finish()
            adInfo.start()
            val adIdInfo = adInfo.info
            adInfo.finish()
            adIdInfo.id
        }
}

When you are ready to use the advertising ID, you need to call another suspending function:

suspend fun applyDeviceId(context: Context) {
    val advertisingInfo = AdvertisingInfo(context)
    // Here is the suspending function call, 
    // in this case I'm assigning it to a static object
    MyStaticObject.adId = advertisingInfo.getAdvertisingId()
}

Upvotes: 11

Ali Nadalizadeh
Ali Nadalizadeh

Reputation: 2826

Using Kotlin & RxJava Observers

Import in your Gradle file

implementation 'com.google.android.gms:play-services-ads:15.0.0'

Import on top of your kotlin source file

import io.reactivex.Observable
import com.google.android.gms.ads.identifier.AdvertisingIdClient

Implement a helper function

    private fun fetchAdIdAndThen(onNext : Consumer<String>, onError : Consumer<Throwable>) {
        Observable.fromCallable(Callable<String> {
            AdvertisingIdClient.getAdvertisingIdInfo(context).getId()
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(onNext, onError);
    }

Then

    fetchAdIdAndThen(Consumer<String>() {
        adId ->
        performMyTaskWithADID(activity, 10000, adId);
    }, Consumer<Throwable>() {
        throwable ->
        throwable.printStackTrace();
        performMyTaskWithADID(activity, 10000, "NoADID");
    })

Upvotes: 0

Meanman
Meanman

Reputation: 1544

You only need this package: implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") It's not really listed anywhere but it's published on Mavne.

Get Google Services using GoogleApiAvailabilityLight.getInstance

Upvotes: 1

htafoya
htafoya

Reputation: 19283

With OS validation.

Call this in an AsyncTask

/** Retrieve the Android Advertising Id 
     * 
     * The device must be KitKat (4.4)+ 
     * This method must be invoked from a background thread.
     * 
     * */
    public static synchronized String getAdId (Context context) {

        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
            return null;
        }

        AdvertisingIdClient.Info idInfo = null;
        try {
            idInfo = AdvertisingIdClient.getAdvertisingIdInfo(context);
        } catch (GooglePlayServicesNotAvailableException e) {
            e.printStackTrace();
        } catch (GooglePlayServicesRepairableException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String advertId = null;
        try{
            advertId = idInfo.getId();
        }catch (NullPointerException e){
            e.printStackTrace();
        }

        return advertId;
    }

Upvotes: 3

user3657232
user3657232

Reputation: 69

Make sure you have added play identity services, then you can get advertising id by running a thread like this:

Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
                String advertisingId = adInfo != null ? adInfo.getId() : null;
            } catch (IOException | GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException exception) {
                exception.printStackTrace();
            }
        }
    };

    // call thread start for background process
    thread.start();

Upvotes: 1

Wahib Ul Haq
Wahib Ul Haq

Reputation: 4415

Just in case someone is interested in trying out the fetching AdvertisingId part while Rx-ing then this might be helpful.

private void fetchAndDoSomethingWithAdId() {
    Observable.fromCallable(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return AdvertisingIdClient.getAdvertisingIdInfo(context).getId();
        }
    })
              .subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(new Action1<String>() {
                  @Override
                  public void call(String id) {
                     //do what you want to do with id for e.g using it for tracking
                  }
              }, new Action1<Throwable>() {
                  @Override
                  public void call(Throwable throwable) {
                      throwable.printStackTrace();
                  }
              });
}

Upvotes: 10

Rajan Kumar Choudhary
Rajan Kumar Choudhary

Reputation: 55

import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;


Info adInfo = null;

try {
     adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);
} catch (IOException e) {
     e.printStackTrace();
} catch (GooglePlayServicesAvailabilityException e) {
     e.printStackTrace();
} catch (GooglePlayServicesNotAvailableException e) {
     e.printStackTrace();
}

String AdId = adInfo.getId();

You need add gms libs otherwise you cannot get the advertising id. It can be reset by user or when you do a factory reset (at factory reset time the Android id also reset).

Upvotes: 1

Timo B&#228;hr
Timo B&#228;hr

Reputation: 2051

Fetch the advertising id from background thread:

    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try {
                AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);
                String adId = adInfo != null ? adInfo.getId() : null;
                // Use the advertising id
            } catch (IOException | GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException exception) {
                // Error handling if needed
            }
        }
    });

I added null checks to prevent any crashes. The Google example implementation code would crash with a NullPointerException if an exception occures.

Upvotes: 9

DaniZ
DaniZ

Reputation: 604

I might be late but this might help someone else!

    AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            AdvertisingIdClient.Info idInfo = null;
            try {
                idInfo = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
            } catch (GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            } catch (GooglePlayServicesRepairableException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            String advertId = null;
            try{
                advertId = idInfo.getId();
            }catch (NullPointerException e){
                e.printStackTrace();
            }

            return advertId;
        }

        @Override
        protected void onPostExecute(String advertId) {
            Toast.makeText(getApplicationContext(), advertId, Toast.LENGTH_SHORT).show();
        }

    };
    task.execute();

Upvotes: 57

Key_coder
Key_coder

Reputation: 536

You need to run your code using Async Task

try this

Using the new Android Advertiser id inside an SDK

Upvotes: 0

Related Questions