【发布时间】:2011-05-30 07:30:43
【问题描述】:
我正在使用 Eclipse 开发适用于 android 的应用程序,并且我想集成 Admob 来赚钱。 教程说我应该看 LogCat 来查找 ID,但它在哪里?
当我在测试模式或真实模式下运行时,有时eclipse会通知广告返回,但它没有显示在emu中......谁能解释一下?
【问题讨论】:
我正在使用 Eclipse 开发适用于 android 的应用程序,并且我想集成 Admob 来赚钱。 教程说我应该看 LogCat 来查找 ID,但它在哪里?
当我在测试模式或真实模式下运行时,有时eclipse会通知广告返回,但它没有显示在emu中......谁能解释一下?
【问题讨论】:
如果您仅在模拟器或少数设备上进行测试,则可接受的答案将起作用,但如果您在过多的设备上进行测试,您可能需要一些以编程方式添加正在运行的设备的设备 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) 更好,后者是返回相关 ID 的内部混淆方法(在 4.0.30 版中)
import hashlib; hashlib.md5(android_id.lower()).hexdigest().upper()。这样,您只需下载一个应用程序即可显示您的 Android ID 并获取其 MD5。
如果您在模拟器上运行 admob 广告,则没有 ID。只需使用 AdManager 方法并将其设置为 TEST_EMULATOR 就像 logcat 说的那样。如果您在带有 USB 调试的实际设备上运行并观察 logcat,ID 将出现在那里。
【讨论】:
类似于 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();
【讨论】:
如果您的应用在 Play 商店中展示实时广告(您不能使用实时广告进行测试),请在代码中添加您的设备 ID,以便在您的真实设备上从 Admob 获取测试广告。切勿在开发或测试期间使用实时广告。
在logcat中获取真实设备ID,
在您的设备上打开任何显示 Admob 实时广告的应用:在连接的设备上,如果您从 Play 商店下载了您的应用(显示实时广告),请打开该应用,否则打开任何其他显示实时 Admob 广告的应用。您的设备应该有互联网连接。
如下图用'device'过滤logcat得到测试设备
【讨论】:
获取哈希设备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 "";
}
【讨论】:
hexString.append(String.format("%02X", 0xFF & messageDigest[i])); 您的实现将在 15 或更小的字节值上给出不正确的输出,因为不会输出前导零。
如果您使用 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/
【讨论】:
如果您是在实际设备上测试您的应用,那么您可以尝试这个为您提供设备 ID 的小型 android 应用:
https://play.google.com/store/apps/details?id=pe.go_com.admobdeviceidfinder&hl=en
您将直接获得经过哈希处理的设备 ID。 希望这会有所帮助。
【讨论】:
要获取设备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()
【讨论】:
另一种展示测试广告的最简单方法是使用横幅的测试设备 ID 来展示 适用于所有设备的 admob 测试广告。 “ca-app-pub-3940256099942544/6300978111”。这个admob测试广告id在google的admob教程中注明:link。 这是上面链接的引用:
【讨论】:
如果您没有在 logcat 中找到它,只需输入任何 设备 ID 并加载您的 广告 并运行您的应用,然后转到你会得到这样的日志I/Ads: Use AdRequest.Builder.addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXX") to get test ads on this device.,然后将它放入并再次运行你的应用程序。
【讨论】:
我有几台正在测试的设备,不想手动获取每台设备的 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);
【讨论】:
我已将此代码用于我的一个项目。希望它对每个人都有帮助:) 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 "";
}
}
【讨论】:
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())
【讨论】: