如何获取 Admob 的设备 ID

Posted

技术标签:

【中文标题】如何获取 Admob 的设备 ID【英文标题】:How can I get device ID for Admob 【发布时间】:2011-05-30 07:30:43 【问题描述】:

我正在使用 Eclipse 开发适用于 android 的应用程序,并且我想集成 Admob 来赚钱。 教程说我应该看 LogCat 来查找 ID,但它在哪里?

当我在测试模式或真实模式下运行时,有时eclipse会通知广告返回,但它没有显示在emu中......谁能解释一下?

【问题讨论】:

【参考方案1】:

如果您仅在模拟器或少数设备上进行测试,则可接受的答案将起作用,但如果您在过多的设备上进行测试,您可能需要一些以编程方式添加正在运行的设备的设备 ID 的方法。

以下代码将以编程方式将当前运行的设备变成adview测试设备

...
    if(YourApplication.debugEnabled(this)) //debug flag from somewhere that you set
    

        String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
        String deviceId = md5(android_id).toUpperCase();
        mAdRequest.addTestDevice(deviceId);
        boolean isTestDevice = mAdRequest.isTestDevice(this);

        Log.v(TAG, "is Admob Test Device ? "+deviceId+" "+isTestDevice); //to confirm it worked
    

您需要使用Android ID的md5,并且必须是大写。这是我使用的md5代码

public static final String md5(final String s) 
    try 
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest
                .getInstance("MD5");
        digest.update(s.getBytes());
        byte messageDigest[] = digest.digest();

        // Create Hex String
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < messageDigest.length; i++) 
            String h = Integer.toHexString(0xFF & messageDigest[i]);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        
        return hexString.toString();

     catch (NoSuchAlgorithmException e) 
        Logger.logStackTrace(TAG,e);
    
    return "";

编辑:显然MD5方法并不完美,建议尝试https://***.com/a/21333739/2662474我不再需要这个功能,所以我没有测试。祝你好运!

【讨论】:

这可能比调用 com.google.android.gms.internal.cm.l(Context ctx) 更好,后者是返回相关 ID 的内部混淆方法(在 4.0.30 版中) 谢谢你!只是把它放到 Python 中,import hashlib; hashlib.md5(android_id.lower()).hexdigest().upper()。这样,您只需下载一个应用程序即可显示您的 Android ID 并获取其 MD5。 和Settings类来自什么包? @joseph 这工作不正常。它遗漏了一些字符。 查看此答案:***.com/a/21333739/4019544 此实现未处理一些零,类似于此处链接的帖子中接受的答案。【参考方案2】:

如果您在模拟器上运行 admob 广告,则没有 ID。只需使用 AdManager 方法并将其设置为 TEST_EMULATOR 就像 logcat 说的那样。如果您在带有 USB 调试的实际设备上运行并观察 logcat,ID 将出现在那里。

【讨论】:

使用上述术语“adRequest”过滤后,您会发现一行 - “ 12-19 17:48:25.615: I/Ads(2132): To get test ads on this device ,调用 adRequest.addTestDevice("D9XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");"。只需复制粘贴代码即可玩得开心。 我的日志显示:“使用 AdRequest.Builder.addTestDevice("5EXXXX etc") 在此设备上获取测试广告。” 只需在 logcat 的过滤器字段中输入“addTestDevice”即可。 我们能否从发布到 Google Play 的已签名 APK 中找到设备 ID? 您可以尝试通过“RequestConfiguration.Builder().setTestDeviceIds”查找密钥【参考方案3】:

类似于 Google Ads 的东西,来自文档:

公共 AdRequest.Builder addTestDevice(字符串 deviceId)

使设备接收测试广告。 deviceId可以通过获取 在创建新广告后查看 logcat 输出。 对于模拟器,请使用 DEVICE_ID_EMULATOR。

例如我在 LogCat 中显示的测试设备 id 是"B86BC9402A69B031A516BC57F7D3063F"

AdRequest adRequest = new AdRequest.Builder() 
        .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
        .addTestDevice("B86BC9402A69B031A516BC57F7D3063F")
        .build();

【讨论】:

【参考方案4】: 您的应用是否已在 Play 商店发布 - 带有实时广告

如果您的应用在 Play 商店中展示实时广告(您不能使用实时广告进行测试),请在代码中添加您的设备 ID,以便在您的真实设备上从 Admob 获取测试广告。切勿在开发或测试期间使用实时广告。

在logcat中获取真实设备ID,

    以 USB 调试模式将您的设备连接到 Android Studio

    在您的设备上打开任何显示 Admob 实时广告的应用:在连接的设备上,如果您从 Play 商店下载了您的应用(显示实时广告),请打开该应用,否则打开任何其他显示实时 Admob 广告的应用。您的设备应该有互联网连接。

    如下图用'device'过滤logcat得到测试设备

阅读Admob ad testing on device - device IDs can change了解更多

【讨论】:

我在运行 Unity Dev Build 时一直在寻找,而这个工作正常。谢谢。【参考方案5】:

获取哈希设备ID

在oncreate里面

String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
        String deviceId = md5(android_id).toUpperCase();
Log.i("device id=",deviceId);

然后为md5()添加这个类

public String md5(String s) 
        try 
            // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();

            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            for (int i=0; i<messageDigest.length; i++)
                hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
            return hexString.toString();

         catch (NoSuchAlgorithmException e) 
            e.printStackTrace();
        
        return "";
    

【讨论】:

谢谢,但实际上您的 md5() 函数中有一个细微的错误。您附加到 hexString 的行应该是这样的:hexString.append(String.format("%02X", 0xFF &amp; messageDigest[i])); 您的实现将在 15 或更小的字节值上给出不正确的输出,因为不会输出前导零。 您的 md5() 生成错误的 ID,预期为 561600E037F6E9EEBE405B487459D786 但 56160E037F6E9EEBE405B487459D786【参考方案6】:

如果您使用 XML 布局展示广告,并且布局 XML 文件中已经包含“ads:testDevices=”,则 AdMob 将不会在 LogCat 输出中打印“To get test ads on this device...”消息.把它拿出来,然后你会看到 LogCat 消息。

这是一个关于如何在 LogCat 中查找设备 ID 的不错的教程: http://webhole.net/2011/12/02/android-sdk-tutorial-get-admob-test-device-id/

【讨论】:

【参考方案7】:

如果您是在实际设备上测试您的应用,那么您可以尝试这个为您提供设备 ID 的小型 android 应用:

https://play.google.com/store/apps/details?id=pe.go_com.admobdeviceidfinder&hl=en

您将直接获得经过哈希处理的设备 ID。 希望这会有所帮助。

【讨论】:

我不确定这就是问题所在。我记得在模拟器中您无法从 Play 商店安装。可能更编程的解决方案(或此应用程序源的相关部分)会更好。 他们中的许多人都发布了程序化解决方案。我刚刚发布了这个,因为它是一种简单而直接的方式来获取 id,尽管它在模拟器上不起作用。无论如何,我编辑了答案。【参考方案8】:

要获取设备ID,请将手机连接到USB并在android studio中打开logcat 使用下面的代码(确保您的设备中启用了 USB 调试)。 然后打开任何有谷歌广告的应用程序(从 Play 商店下载任何随机应用程序)。如图所示,在 Logcat 中键入“set”。您的设备 ID 在图像中突出显示为

setTestDeviceIds(Arrays.asList("CC9DW7W7R4H0NM3LT9OLOF7455F8800D")).

在代码中使用测试设备,如图所示

val adRequest = AdRequest
        .Builder()
        .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
        .addTestDevice("CC9DW7W7R4H0NM3LT9OLOF7455F8800D")
        .build()

【讨论】:

【参考方案9】:

另一种展示测试广告的最简单方法是使用横幅的测试设备 ID 来展示 适用于所有设备的 admob 测试广告。 “ca-app-pub-3940256099942544/6300978111”。这个admob测试广告id在google的admob教程中注明:link。 这是上面链接的引用:

这是插页式广告“ca-app-pub-3940256099942544/1033173712”的测试设备 ID。这也用于interstitial tutorial

【讨论】:

【参考方案10】:

如果您没有在 logcat 中找到它,只需输入任何 设备 ID 并加载您的 广告 并运行您的应用,然后转到你会得到这样的日志I/Ads: Use AdRequest.Builder.addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXX") to get test ads on this device.,然后将它放入并再次运行你的应用程序。

【讨论】:

【参考方案11】:

我有几台正在测试的设备,不想手动获取每台设备的 DeviceID。此处以编程方式获取 DeviceID 的答案对我不起作用(缺少零),这导致显示真实广告而不是测试广告。

我把它放在我的 Application 类 onCreate 中,然后使用 getter 方法公开 deviceId,以便可以在整个过程中访问它。

@Override
public void onCreate()         
    super.onCreate();

    String androidId =  Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
    deviceId = MD5(androidId).toUpperCase();        
  

public static String getDeviceId() 
    return deviceId;


private static String deviceId;

还有MD5方法;

public String MD5(String md5) 
   try 
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) 
            sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
        
        return sb.toString();
     catch (java.security.NoSuchAlgorithmException e) 
    
    return null;

然后在我创建 AdRequest 对象时使用它:

if(BuildConfig.DEBUG) 
     AdRequest adRequest = new AdRequest.Builder()
          .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
          .addTestDevice(Application.getDeviceId())
          .build();
     adView.loadAd(adRequest);
 else 
     AdRequest adRequest = new AdRequest.Builder()
          .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
          .build();
     adView.loadAd(adRequest);

【讨论】:

【参考方案12】:

以这种方式工作:

InterstitialAd mInterstitial = new InterstitialAd(this);
    mInterstitial.setAdUnitId("your id");
    AdRequest adRequest = new AdRequest.Builder()
    .addTestDevice("some words")
    .build();
    mInterstitial.loadAd(adRequest);

运行应用程序后... 进入 Logcat 输入 Verbose 输入搜索字段 AdRequest,所以 id 设备显示 donw。

.addTestDevice("把id放在这里");

希望对你有所帮助;

【讨论】:

【参考方案13】:

将此类添加到您的项目中

import android.content.Context;
import android.provider.Settings;
import android.text.TextUtils;

import com.google.android.gms.ads.AdRequest;
import java.io.UnsupportedEncodingException;

public class AdsHelper 
public static AdRequest createRequest(Context context) 
    AdRequest.Builder adRequest = new AdRequest.Builder();
    adRequest.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
    if (BuildConfig.DEBUG) 
        String deviceId = MD5(getDeviceId(context));
        if (!TextUtils.isEmpty(deviceId)) 
            adRequest.addTestDevice(deviceId.toUpperCase());
        
    

    return adRequest.build();




    private static String MD5(String md5) 
        if (TextUtils.isEmpty(md5)) return null;
        try 
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            byte[] array = md.digest(md5.getBytes("UTF-8"));
            StringBuilder sb = new StringBuilder();
            for (byte anArray : array) 
                sb.append(Integer.toHexString((anArray & 0xFF) | 0x100).substring(1, 3));
            
            return sb.toString();
         catch (java.security.NoSuchAlgorithmException ignored) 
         catch(UnsupportedEncodingException ignored)
        
        return null;
    

    private static String getDeviceId(Context context) 
        try 
            return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
         catch (Exception e) 
            return "";
        

    

用法:

AdRequest adRequest = AdsHelper.createRequest(this);

【讨论】:

谢谢,结果和adRequest在logcat中显示的一样。【参考方案14】:

应用程序:build.gradle

dependencies 
...
compile 'com.google.firebase:firebase-ads:10.0.1'
...

您的活动:

 AdRequest.Builder builder = new AdRequest.Builder();
        if(BuildConfig.DEBUG)

            String android_id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
            String deviceId = io.fabric.sdk.android.services.common.CommonUtils.md5(android_id).toUpperCase();
            builder.addTestDevice(deviceId);
        
        AdRequest adRequest = builder.build();
    adView.loadAd(adRequest);

【讨论】:

【参考方案15】:

对于模拟器,无需在“测试设备”中添加设备 对于真机,找到如下广告 ID 并添加到 Admob 帐户

【讨论】:

【参考方案16】:

我已将此代码用于我的一个项目。希望它对每个人都有帮助:) Rajji

public String getDeviceId()
    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    String androidId = 
  Settings.Secure.getString((ContentResolver)this.getContentResolver(),"android_id");
    messageDigest.update(androidId.getBytes());
    byte[] arrby = messageDigest.digest();
    StringBuffer sb = new StringBuffer();
    int n = arrby.length;
    for(int i=0; i<n; ++i)
        String oseamiya = Integer.toHexString((int)(255 & arrby[i])));
        while(oseamiya.length() < 2)
            oseamiya = "0" + oseamiya;
        
        sb.append(oseamiya);
    
    try
        String result = sb.toString();
        return result;
    catch(NoSuchAlgorithmException e)
        e.printStackTrace();
        return "";
    


【讨论】:

【参考方案17】:

Kotlin 解决方案:

获取当前设备 ID:

@SuppressLint("HardwareIds")
private fun getDeviceIdForAdMobTestAds(context: Context): String? 
    val md5 = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
    try 
        val md = MessageDigest.getInstance("MD5")
        val array = md.digest(md5.toByteArray())
        val sb = StringBuilder()
        for (i in array.indices)
            sb.append(Integer.toHexString(array[i].toInt() and 0xFF or 0x100).substring(1, 3))
        return sb.toString()
     catch (e: NoSuchAlgorithmException) 
    
    return null

用法:

val deviceIds = arrayListOf(AdRequest.DEVICE_ID_EMULATOR)
getDeviceIdForAdMobTestAds(context)?.let  deviceIds.add(it.uppercase(Locale.ROOT)) 
MobileAds.setRequestConfiguration(RequestConfiguration.Builder().setTestDeviceIds(deviceIds).build())

【讨论】:

以上是关于如何获取 Admob 的设备 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RoboVm 上获取 AdMob

Xcode:如何摆脱这个 AdMob 日志消息?

Admob测试ID不断变化

Admob插页式广告显示带有新广告单元ID的黑色

如何获取我的注册 ID 设备

Worklight:如何获取推送订阅的当前设备 ID