如何获取 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 & 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的主要内容,如果未能解决你的问题,请参考以下文章