Answers:
如果您在模拟器上运行admob广告,则没有ID。只需使用AdManager方法并将其设置为TEST_EMULATOR,就像logcat所说的那样。如果您使用USB调试在实际设备上运行并观看logcat,则ID将显示在其中。
如果仅在仿真器或少数设备上进行测试,则可接受的答案将起作用,但是,如果您在过多的设备上进行测试,则可能需要一些方法来随机添加正在运行的设备的设备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://stackoverflow.com/a/21333739/2662474我不再需要此功能,所以我没有进行测试。祝好运!
com.google.android.gms.internal.cm.l(Context ctx)
方法更好,后者是内部混淆方法(在版本4.0.30中),该方法返回返回有问题的ID
import hashlib; hashlib.md5(android_id.lower()).hexdigest().upper()
。这样,您可以下载一个应用程序以显示您的Android ID并获取其中的MD5。
来自文档的类似于Google Ads的内容:
公共AdRequest.Builder addTestDevice(字符串deviceId)
使设备接收测试广告。可以 在创建新广告后查看logcat输出来获取deviceId 。对于仿真器,请使用DEVICE_ID_EMULATOR。
例如,我在LogCat中显示的测试设备ID是"B86BC9402A69B031A516BC57F7D3063F"
:
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("B86BC9402A69B031A516BC57F7D3063F")
.build();
如果您的应用程序在Play商店中展示实时广告-您不能使用实时广告进行测试-在代码中添加设备ID即可从真实设备上的Admob获取测试广告。在开发或测试过程中,切勿使用实时广告。
要在logcat中获取真实的设备ID,
打开设备上显示来自Admob的实时广告的任何应用程序:在已连接的设备上,如果您已从Play商店下载了应用程序(显示实时广告),请打开该应用程序,或者打开其他任何显示Admob实时广告的应用程序。您的设备应该可以连接互联网。
如下所示,用'device'过滤logcat以获取测试设备
获取哈希设备ID
在内部
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 "";
}
hexString.append(String.format("%02X", 0xFF & messageDigest[i]));
您的实现将在15或更少的字节值上给出错误的输出,因为不会输出前导零。
如果您要使用XML布局显示广告,并且在布局XML文件中已经包含“ ads:testDevices =“,则AdMob不会在LogCat输出中显示“要在此设备上获取测试广告...”消息。取出它,然后您将看到LogCat消息。
这是一个很好的教程,介绍如何在LogCat中查找设备ID:http ://webhole.net/2011/12/02/android-sdk-tutorial-get-admob-test-device-id/
如果您要在实际设备上测试您的应用,则可以尝试使用此小型Android应用,该应用会为您提供设备ID:
https://play.google.com/store/apps/details?id=pe.go_com.admobdeviceidfinder&hl=zh_CN
您将直接获得散列的设备ID。希望这可以帮助。
要获取设备ID,请将手机连接到USB,然后在android studio中打开logcat。请使用以下代码(确保已在设备中启用USB调试功能)。然后打开任何带有Google广告的应用(从Play商店下载任何随机应用)。如图所示,在Logcat中键入“设置”。您的设备ID在图像中以高亮显示为
setTestDeviceIds(Arrays.asList(“ CC9DW7W7R4H0NM3LT9OLOF7455F8800D”))。
如图所示,在代码中使用测试设备
val adRequest = AdRequest
.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("CC9DW7W7R4H0NM3LT9OLOF7455F8800D")
.build()
我正在测试一些设备,并且不想手动获取每个设备的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);
}
以这种方式工作:
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放在此处”);
我希望能有所帮助;
将此课程添加到您的项目中
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);
应用程式: 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);