Как получить Рекламный ID в Android программно

Я хочу получить рекламный идентификатор для пользователей программным способом. Я использовал приведенный ниже код с сайта разработчика. Но он не работает

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

Как я могу получить рекламный идентификатор пользователя программно?? Помогите мне, пожалуйста

13 ответов

Я могу опоздать, но это может помочь кому-то еще!

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

Получить GAID(рекламный идентификатор Google)

1. Загрузите последнюю версию Google Play Services SDK.
2. Импортируйте код и добавьте его как проект библиотеки.
3. Измените AndroidManifest.xml.

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

4. Включите ProGuard, чтобы уменьшить и запутать ваш код в проекте. Свойства этой строки

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

5. Добавьте правила в 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. Вызовите AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext()). GetId() в рабочем потоке, чтобы получить идентификатор в строке. как это

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

Наслаждайтесь!

или же

https://developervisits.wordpress.com/2016/09/09/android-2/

Вы можете вызвать приведенную ниже функцию в onCreate(Bundle savedInstanceState) действия

и в logcat для поиска UIDMY он отобразит идентификатор, например: 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(conext, "error occured ", Toast.LENGTH_SHORT);
    toast.setGravity(gravity, 0,0);
    toast.show();

            }
        }
    });
}

Современный способ - использовать Coroutines в Kotlin, поскольку AsyncTask теперь устарел для Android. Вот как я это сделал:

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

Когда вы будете готовы использовать рекламный идентификатор, вам нужно вызвать другую функцию приостановки:

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

На всякий случай, если кто-то заинтересован попробовать AdvertisingId Часть RX-ING, то это может быть полезно.

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

Получить рекламный идентификатор из фоновой темы:

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

я добавил null проверяет, чтобы предотвратить любые сбои. Код реализации примера Google будет зависать с NullPointerException если происходит исключение.

С проверкой ОС.

Вызовите это в 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;
    }

Если вы используете Kotlin, используйте это, чтобы получить идентификатор Google Advertising ID устройства.

      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")

    }

Убедитесь, что вы добавили сервисы идентификации личности, тогда вы можете получить рекламный идентификатор, запустив такой поток:

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

Вам нужен только этот пакет: реализация ("com.google.android.gms:play-services-ads-identifier:17.0.0") На самом деле он нигде не указан, но опубликован на Mavne.

Получите сервисы Google с помощью GoogleApiAvailabilityLight.getInstance

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

Вам нужно добавить gms libs, иначе вы не сможете получить рекламный идентификатор. Он может быть сброшен пользователем или при сбросе настроек к заводским настройкам (при сбросе настроек к заводским настройкам идентификатор Android также сбрасывается).

Использование наблюдателей Kotlin и RxJava

Импортируйте в свой файл Gradle

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

Импортировать поверх исходного файла kotlin

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

Реализуйте вспомогательную функцию

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

потом

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

Вам нужно запустить свой код с помощью Async Task

попробуй это

Использование нового идентификатора рекламодателя Android внутри SDK

Другие вопросы по тегам