I'm using an AdMob view in an android app, but I'm unable to get any ad into the app.
For reference, I've added the view to a ListView as explained by Dan Dyer here
EDIT:
I'm using GoogleAdMobAdsSdk-4.1.1. The release notes of Google AdMob Ads SDK for version 4.1.0 says:
"...
- Added support for AdRequest.addTestDevice() and AdRequest.setTestDevices(). Note that AdRequest.setTesting() is now deprecated.
..."
This is how the ad is inserted to my ListView:
public View getView(int position, View convertView, ViewGroup parent) {
// Some other code
// Reusing convertView etc.
AdView adView =
new AdView((Activity) getContext(), AdSize.BANNER,
"/xxxxxx/ca-pub-xxxxxxx/my_ad_unit");
for (int i = 0; i < adView.getChildCount(); i++) {
adView.getChildAt(i).setFocusable(false);
}
adView.setFocusable(false);
float density = getContext().getResources().getDisplayMetrics().density;
int height = Math.round(50 * density);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
AbsListView.LayoutParams.FILL_PARENT, height);
adView.setLayoutParams(params);
AdRequest request = new AdRequest();
request.addTestDevice("xxxxxxxxxxxxxxxxx");
adView.loadAd(request);
// other stuff
// returning convertView
}
I've also added an AdListener to the adview, and on every loadAd, the onFailedToReceiveAd callback method is called:
public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
Log.d(TAG, "AdMob in list failed to receive ad: " + arg1.name());
}
In logcat I get this message:
08-17 15:22:18.065: AdMob in list failed to receive ad: NO_FILL
Can anyone tell me what this errorcode means?
To answer the question:
NO_FILL is returned from AdMob when there is no inventory left to
serve in the AdMob/DFP backend.
First of all this meant I was requesting an ad of size AxB, but the backend had no ads of this size left to show. It is important that the size you request has inventory left in the backend systems of AdMob/DFP.
Second, their API states that the first time you request an ad to a specific ad unit, you should expect up to two minutes before the ads start serving. I don't know if it is because I am not stationed in the US, but these two minutes often becomes at least 20 minutes if not several hours for me.
I get a 'No Fill' response when I make a request for ads in the Test or Non-Test Mode. What should I do?
In both the Test and Non-Test modes, depending on various parameters such as server load, non-availability of targeted ads, and so on, the Ad Server may send a No Fill response. Try reloading the ad after some time to keep receiving the ads. Although a No Fill is common in the advertising space, you can write to us with your queries.
http://developer.inmobi.com/wiki/index.php?title=Android
This essentially means there are no Ads currently with AdMob for your FILL request. Run AdMob in test mode and you can see the ad.
request.setTesting(true);
Change the package name of your live app or game in market available..
and use your new admob-id in the project , check once..
androidadmobunityunity3d
Related
When I try to load an interstitial with inmobi.com and most of the times I get the error "ad request successful but no ad served". Why is this happening? Any solution for this? It works well with testing ads when set to "Test mode" in the website. Will this be because inmobi has not enough providers to display ads at that moment?
I asked Inmobi support page but they don't answer. I am starting to regret moving from admob to inmobi.
This is the code I use:
JSONObject consentObject = new JSONObject();
try {
consentObject.put(InMobiSdk.IM_GDPR_CONSENT_AVAILABLE, true); // Provide correct consent value to sdk which is obtained by User
consentObject.put("gdpr", "1"); // Provide 0 if GDPR is not applicable and 1 if applicable
//consentObject.put(InMobiSdk.IM_GDPR_CONSENT_IAB, “<<consent in IAB format>>”); // Provide user consent in IAB format
} catch (JSONException e) {
}
InMobiSdk.init(this, "My InMobi Account ID here", consentObject);
long MyPlacementID = 1234566789L; //My Placement ID here as long
mInterstitialAd = new InMobiInterstitial(this, MyPlacementID, new InterstitialAdEventListener() {
#Override
public void onAdLoadSucceeded(InMobiInterstitial inMobiInterstitial) {
super.onAdLoadSucceeded(inMobiInterstitial);
if (inMobiInterstitial.isReady()) {
mInterstitialAd.show();
}
#Override
public void onAdLoadFailed(InMobiInterstitial inMobiInterstitial, InMobiAdRequestStatus inMobiAdRequestStatus) {
sError = inMobiAdRequestStatus.getMessage();
Here I get error: "ad request successful but no ad served"
}
I emailed the support team and they answered that is shown if they don't have any ad to be displayed (maybe for my location or for my time). So, it is just that they run out of ads to be displayed. If I try it many many times then I may get one ad. So it is a server problem. Not enough clients to pay for ads. It is a pity.
I was having the same issue.I tried different ways to get the test ads.But everything was in vein.Then i went through their documentation and found that we need to set up a layout for ad placement.There is an option to customize that.Click on save and then add your device id in the testing devices section, you will see test ads coming up.I found this one from an article where it said "If you set banner sizes different from those provided by default, the SDK will refuse to load data and will issue a corresponding message to the log:
[InMobi]: Failed to fetch ad for placement id: 201901231449, reason phrase available in onAdLoadFailed callback.
And the message “Ad request successful but no ad served” with the code “NO_FILL” appears in the listener's method. Hence our expert advice: always redefine the listener's methods which are responsible for errors. Acting such a way, you'll avoid many difficulties later."
https://agilie.com/en/blog/how-to-integrate-inmobi-sdk-to-start-monetizing-your-android-app
Contradicting answer to #Ton's answer.
All the ad servers work in the following manner. Advertisers pay for ads with specific targetted audiences. So whenever you ask an ad network to provide an ad it actually checks if they have an ad for which targeting is matched with the current user (for ex. area, gender, age as and when available). If they don't have any ad which can be shown to the current user then they will fire NO_FILL.
Also, specific to InMobi, they don't provide many ads on emulators so try on a physical device to get ads.
I'm using Facebook's NativeAdManager for Android as intended:
nativeAdsManager = new NativeAdsManager(context, "my_placement_id", 3);
which should load me 3 different ads, and them allow me to get them in my adapter using:
NativeAd adItem = nativeAdsManager.nextNativeAd();
but for some reason I always get the same ad. According to their reference:
The NativeAdsManager provides a mechanism to fetch a set of NativeAds and then use them within your application. The recommended usage is to call nextNativeAd() at the moment when you are about to render an ad. The NativeAdsManager can hold at most 10 unique ads at once but supports giving out as many ads as needed by cloning over the set of NativeAds it got back from the server which can be useful for feed scenarios.
Am I missing something here?
Admob Live ads are not showing, while testing ads are showing. Live ads are not showing at all, I don't know what i am missing.
Here is code.
String.java XML
<!-- Insert Id admob -->
<string name="BannerAd_unit_id">cca-app-pub-1154915214031679/2100011458</string>
<string name="InterstitialAd_unit_id">ca-app-pub-1154915214031679/9049914448</string>
MainGame.Java Class
this.BANNER_AD_UNIT_ID = getResources().getString(R.string.BannerAd_unit_id);
showBanner();
screen java.class
public void showBanner() {
//banner ad
if (BANNER_AD_UNIT_ID.length() > 0) {
// Create an ad.
adView = new AdView(this);
adView.setAdSize(AdSize.BANNER);
adView.setAdUnitId(BANNER_AD_UNIT_ID);
//make ad visible on bottom of screen
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params1.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params1.addRule(RelativeLayout.CENTER_HORIZONTAL);
adView.setLayoutParams(params1);
layout.addView(adView);
// Create an ad request. Check logcat output for the hashed device ID to
// get test ads on a physical device.
AdRequest adRequest = new AdRequest.Builder()
//.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
//.addTestDevice("C01834A0B4A8FA4C03A0E09605F43819")//GalaxyS4*/
.build();
// Start loading the ad in the background.
adView.loadAd(adRequest);
}
}
If I Remove comment ".addTestDevice" Then testing ads are showing, if I comment it then live ads not showing. I don't know what is going on, any help will be appreciated.
If you're not receiving real ads, but are receiving 'test ads' then the implementation should be ok.
If you just created the ad account, it takes a few hours until real ads will appear and sometimes there might be no adds available to show.
Set an adListener to your adView and see what you're getting back. It might be a ERROR_CODE_NO_FILL or it might give you other hints to solve the problem.
Make sure you have updated AdMob with your payment details (go to Payments Section for that).
Check your AdMob dashboard to see the status of your ads to check if they are active.
Verify you used the correct Ad Unit Id.
After you update your info, it may take up to 24 hours to verify your information. After verification, they will enable your ad serving. You will get an email notification saying your ads are now being served.
If the test ads are working fine then your implementation is correct, but there is an option of "Payment" in the admob account which you need to fill. After filling up that form you will receive an email regarding the confirmation of payment details and message indicating that whether your information was accepted by the admob team or not if yes then your live ads will be showing up. But keep in mind that for the first few time the ad won't show up. it takes time to appear after the approval as well.
Here is the code snippet for the error code to find what is going wrong
mAdView = (com.google.android.gms.ads.AdView) findViewById(R.id.adView);
mAdView.setAdListener(new com.google.android.gms.ads.AdListener() {
#Override
public void onAdLoaded() {
// Code to be executed when an ad finishes loading.
Toast.makeText(HomeActivity.this, "onAdLoaded", Toast.LENGTH_SHORT).show();
}
#Override
public void onAdFailedToLoad(int errorCode) {
if(errorCode==AdRequest.ERROR_CODE_INTERNAL_ERROR)
Toast.makeText(HomeActivity.this, "onAdFailedToLoad", Toast.LENGTH_SHORT).show();
// Code to be executed when an ad request fails.
}
#Override
public void onAdOpened() {
Toast.makeText(HomeActivity.this, "onAdOpened", Toast.LENGTH_SHORT).show();
}
#Override
public void onAdLeftApplication() {
Toast.makeText(HomeActivity.this, "onAdLeftApplication", Toast.LENGTH_SHORT).show();
}
#Override
public void onAdClosed() {
Toast.makeText(HomeActivity.this, "onAdClosed", Toast.LENGTH_SHORT).show();
}
})
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
Get the error code:
ERROR_CODE_INTERNAL_ERROR - Something happened internally; for instance, an invalid response was received from the ad server.
ERROR_CODE_INVALID_REQUEST - The ad request was invalid; for instance, the ad unit ID was incorrect.
ERROR_CODE_NETWORK_ERROR - The ad request was unsuccessful due to network connectivity.
ERROR_CODE_NO_FILL - The ad request was successful, but no ad was returned due to lack of ad inventory.
I've been trying to get AdMob to work for some time on my app. I keep getting onFailedToRecieveAd(Invalid Ad Request) message in the log. I've paired down my test application to this:
AdView adView;
LinearLayout ll;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adView = new AdView(this, AdSize.BANNER, "pub-2...............");//inserted my 16 digit pub id here
adView.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(adView);
setContentView(ll);
AdRequest adRequest = new AdRequest();
adRequest.addTestDevice("3...............");// 16 digits, tried other strings as
// follows:
//for addTestDevice I've tried several numbers, including the 16 digit device
// number given me by my "device id" application, the "0123456789ABCDEF" device number
// given by my console and device windows, the "CECE.........................." 32 digit
// device number my logcat file told me to use in a logcat message,
// "AdRequest.TEST_EMULATOR"
// which an admob example in the docs said to use, "9774d56d682e549c" which another
// admob docs example said to use.
adView.loadAd(adRequest);
I've also tried adView.loadAd(new AdRequest()); using no device id as in another one of the google admob example apps.
nothing has worked to show anything, it's not even creating space for the ad, just the onFailedToRecieveAd(Invalid Ad Request) message in the logcat
I've also included the necessary permissions and "com.google.ads.AdActivity" in the manifest.
Wow, after days of frustration and posts to various forums I've found the answer.
You have to go to your account on the Admob website to set up your specific app for the admob ads and get a new longer publisher number. My publisher number only started with 'pub-......' where my new number is longer and starts with 'ca-app-pub-.......'. I was curious about this from the start when I saw the 'ca-app-pub' preface in an example banner ap.
Nowhere on the Google Admob "Google Mobile Ads SDK" development site in the "banner ads 1" instructions (https://developers.google.com/mobile-ads-sdk/docs/admob/fundamentals?hl=en_US#android) does it mention having to go back to your admob account to set up your specific app for ads and get a new publisher number.
The stupid mistakes are the hardest to fix.
Be carefull with the id, there are 2 codes: the editor number (like this: pub-xxxxxxxxxxxxxxxx) and the other is the banner id (like this: ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx) (this one you need to use)
You need to use the last one, if you use the first doesnt work:)
It is not unusual to get a failed to receive ad. This is a normal message essentially saying that there are no ads to serve for your app at this point in time.
It means that your Admob integration is working, you are getting a response back from the server. As your app sends more requests it will be more likely to receive ad impressions.
Have you tried requesting an ad without setting the test device ID?
adView.loadAd(new AdRequest());
Try adding the following lines of code to get more info about the failure:
// Set AdListener
adView.setAdListener(new AdListener() {
#Override
public void onFailedToReceiveAd(Ad ad, ErrorCode error) {
System.err.println("Ad failed: " + ad.toString() + error.toString());
}
#Override
public void onReceiveAd(Ad ad) {
System.out.println("Ad received: " + ad.toString());
}
});
I am using admobs in my android app and would like to test it with selected users on forums , family and friends.
I would like to display the test ads on their devices to avoid issues with conditions.
The doc says:
adRequest.addTestDevice("TEST_DEVICE_ID");// Test Android Device
But as I plan to share to non-tech people, I am pretty sure they won't be able to get their devices ID.
Is there a way to force displaying test ads on any devices?
Thank a lot.
You can use below line
adRequest.setTesting(true);
See I have used like this for testing purpose
AdRequest adRequest = new AdRequest();
adRequest.setTesting(true);
adView.loadAd(adRequest);
I don't know if there is a way to display test ads on select devices, but you could insert a view that has the same dimensions as the ad (50 by 350 I think?) and make it clear that an ad should go there. If you really wanted to you could even make it an image view, take a screen shot of Google's test ad, and create an onClickListener that sends you to Google.com.
This one was the correct answer
https://stackoverflow.com/a/8665279/327402
Not official but at least, that works!
String aid = Settings.Secure.getString(getContext().getContentResolver(), "android_id");
Object obj = null;
try {
((MessageDigest) (obj = MessageDigest.getInstance("MD5"))).update(
aid.getBytes(), 0, aid.length());
obj = String.format("%032X", new Object[] { new BigInteger(1,
((MessageDigest) obj).digest()) });
} catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
obj = aid.substring(0, 32);
}
adRequest.addTestDevice(obj.toString());