Quick Links: Download Gideros Studio | Gideros Documentation | Gideros Development Center | Gideros community chat
Gideros and GDPR? - Page 2 - Gideros Forum

Gideros and GDPR?

24

Comments

  • SinisterSoftSinisterSoft Maintainer
    @simwhi The ads libs determine where the user is.
    @hgy29 I think if they don't provide a switch AND haven't said if they are GDPR ready. For example Chartboost has said they are ready and don't provide a switch - that means it must be within their library or they anonymise the data already.

    Like I said though - if a game provides a switch and the user says ok to consent then the game also must have a way of forgetting all the information and also of providing what has been collected. Which opens up a can of worms!

    Likes: MobAmuse

    +1 -1 (+1 / -0 ) Share on Facebook
  • simwhisimwhi Member


    Like I said though - if a game provides a switch and the user says ok to consent then the game also must have a way of forgetting all the information and also of providing what has been collected. Which opens up a can of worms!


    @SinisterSoft Yes, indeed it does. We do not want to fall into this situation. We want to be GDPR compliant by not having, storing or using personal information at all.

    Analytics would be useful but we can live without it if need be.
  • MobAmuseMobAmuse Member
    In reality could you imagine getting a 20Million fine? How the shat in crikey would you even begin to pay that off LOL :D The whole thing is a farce. I smell DOOM.
    +1 -1 (+3 / -0 ) Share on Facebook
  • SinisterSoftSinisterSoft Maintainer
    It will go the way of cookie compliance.

    Likes: MobAmuse

    +1 -1 (+1 / -0 ) Share on Facebook
  • MobAmuseMobAmuse Member
    I've done what I can to the best of my ability over the last few weeks. I really don't think this has been 100% thought through by many mobile providers. Everybody wants to pass the buck on to the small guy. Totally ridiculous situation.

    Likes: simwhi

    +1 -1 (+1 / -0 ) Share on Facebook
  • antixantix Member
    edited May 24
    Personally I'll just plod along as I always have because IMHO it's a big 'storm in a teacup'.

    If the fine is 20 million Euros and there are millions of apps in the google play store that break their new law then the EU is going to be so rich! However.. how the heck will they be able to afford to take millions of people to court to prosecute them? How many decades would it be before they even got to prosecuting me? Long after I'm dead and turned to dust I think.

    Let us not forget also that there is the apple app store, steam, itch.io, and thousands of other sites on the net that sell games and apps that can collect such information on their users. There are so many that no organization ever would be able to prosecute them all.. period!

    I think that if they were going to make a scapegoat of someone... they would target a large company that hadn't crossed their t's and dotted their i's. They are hardly going to peruse every indie dev in the world.
    +1 -1 (+3 / -0 ) Share on Facebook
  • MobAmuseMobAmuse Member
    Yep I've done all I can and am going to do already.

    May the force be with you all! :)
    +1 -1 (+2 / -0 ) Share on Facebook
  • MobAmuseMobAmuse Member
    Yes not all providers are going in as default false...

    ---

    By default, ad requests to Chartboost serve personalized ads, with ad selection based on the user’s previously collected data.

    Now with SDK v7.2.0, ad requests to Chartboost with restrictDataCollection=YES will remove the IP address and device information from processing. With restrictDataCollection enabled, the user will not receive an ad.

    Ad requests with restrictDataCollection=NO will process that user’s IP address and device information. Chartboost will serve an ad using contextual and behavioral targeting unless otherwise specified.

    Likes: jdbc

    +1 -1 (+1 / -0 ) Share on Facebook
  • MobAmuseMobAmuse Member
    I therefore think the flags should be exposed via Gideros so they can be set in Lua perhaps. I imagine that to be a task given the amount of different providers tho :P
  • jdbcjdbc Member
    edited May 26
    I have removed all my Admob blocks. I have no time now to update all my apps.

    I will plan to update apps from one to one, may be some will be paid another free. No reason to use Ads if they pass the responsability of GDPR to developer.
  • MobAmuseMobAmuse Member
    'With restrictDataCollection enabled, the user will not receive an ad' ...WTF!

    The other news to learn there is not only will charboost not show you a targeted ad if flag set true, they wont show you and ad at all LOL :D ...and we all know that that means WTF in a free game. People will just switch your ads off 100% given that choice! :P

    Likes: jdbc

    +1 -1 (+1 / -0 ) Share on Facebook
  • jdbcjdbc Member
    edited May 26
    MobAmuse said:

    Yes not all providers are going in as default false...

    ---

    By default, ad requests to Chartboost serve personalized ads, with ad selection based on the user’s previously collected data.

    Now with SDK v7.2.0, ad requests to Chartboost with restrictDataCollection=YES will remove the IP address and device information from processing. With restrictDataCollection enabled, the user will not receive an ad.

    Ad requests with restrictDataCollection=NO will process that user’s IP address and device information. Chartboost will serve an ad using contextual and behavioral targeting unless otherwise specified.

    I have received the same message, so I will remove all my apps from Chartboost. Anyway I do not get money, I think I will remove my Chartboost account for ever.

    https://answers.chartboost.com/en-us/zingtree
  • jdbcjdbc Member
    edited May 26
    MobAmuse said:

    'With restrictDataCollection enabled, the user will not receive an ad' ...WTF!

    The other news to learn there is not only will charboost not show you a targeted ad if flag set true, they wont show you and ad at all LOL :D ...and we all know that that means WTF in a free game. People will just switch your ads off 100% given that choice! :P

    Right, so there is no reason to use Chartboost from now. I will delete my account.

    Paid app will go back now if Ad business model is not an option. I will change all my apps to paid (may be some fully free) because of this.

    Likes: MobAmuse

    +1 -1 (+1 / -0 ) Share on Facebook
  • MobAmuseMobAmuse Member
    The only other way if you wish to comply, is remove all free games with ads in from Europe on Google Play, iOS App Store and Amazon perhaps. Crazy!

    Likes: jdbc

    +1 -1 (+1 / -0 ) Share on Facebook
  • jdbcjdbc Member
    I have requested to delete my Chartboost acount, no reason to use it.
  • jdbcjdbc Member
    MobAmuse said:

    The only other way if you wish to comply, is remove all free games with ads in from Europe on Google Play, iOS App Store and Amazon perhaps. Crazy!

    I am doing it right now.

    Likes: MobAmuse

    +1 -1 (+1 / -0 ) Share on Facebook
  • MobAmuseMobAmuse Member
    I'll be doing all mine soon - hardly make much from any of Europe paid or free anyway TBH.
  • jdbcjdbc Member
    edited May 26
    MobAmuse said:

    I'll be doing all mine soon - hardly make much from any of Europe paid or free anyway TBH.

    Anyway there could be European people living in America for example. How you are going to handle this data?

    I think we do not use personal data in our games, so the responsability of GDPR is for Ads companies who collects data.
  • jdbcjdbc Member
    edited May 26
    I guess GPDR is almost impossible to follow by big companies.
  • SinisterSoftSinisterSoft Maintainer
    There is no way to fully comply with GDPR with the current ads libs, even if they say they are compliant. If the person says it's ok to use their personal information then the ads providers also need to provide functions to 'forget' the user and also a way to deliver all they data they have on them in a machine readable form.
  • SinisterSoftSinisterSoft Maintainer
    edited May 26
    It may also be illegal for an app to not allow you to play/use it if you refuse to allow the company to take the data. Facebook and Google are both being taken to court (announced yesterday) because if the user doesn't allow them to take personal data then they provide a more limited service or don't allow access at all. That is for a service that needs personal data to actually operate - and is actually free!!!

    In other words, there are some people who want to use facebook in the same way as everyone else but do not want facebook to have any data that can be used to identify them and they don't want facebook to communicate with them!

    btw, the lawyer suing them is one of the lawyers who made up the regulations.

    http://money.cnn.com/video/technology/2018/05/25/burke-facebook-gdpr-lawsuit.cnnmoney/index.html
  • jdbcjdbc Member
    edited May 26
    For me solution will be to remove all ads from apps. Ads business model could be in problem with this law.

    Ads companies put responsability on publisher but it is not worth if you do not make money. Better removing ads and publishing as paid app. No more free apps.
  • jdbcjdbc Member

    It may also be illegal for an app to not allow you to play/use it if you refuse to allow the company to take the data. Facebook and Google are both being taken to court (announced yesterday) because if the user doesn't allow them to take personal data then they provide a more limited service or don't allow access at all. That is for a service that needs personal data to actually operate - and is actually free!!!

    In other words, there are some people who want to use facebook in the same way as everyone else but do not want facebook to have any data that can be used to identify them and they don't want facebook to communicate with them!

    btw, the lawyer suing them is one of the lawyers who made up the regulations.

    http://money.cnn.com/video/technology/2018/05/25/burke-facebook-gdpr-lawsuit.cnnmoney/index.html

    Facebook company is based on personal data, without them there is no service indeed.

    Likes: antix, MobAmuse

    +1 -1 (+2 / -0 ) Share on Facebook
  • MobAmuseMobAmuse Member
    I don't think there as any good right answer here whatever you choose to do in the current climate.

    I've decided other than what I've already done, that I'm just going to wing it and see what happens given a lot of it seems to be in a state of flux.

    If the big boys can't sort it out then we have almost no chance of getting it right here.
    +1 -1 (+5 / -0 ) Share on Facebook
  • simwhisimwhi Member
    edited June 1
    Hi,

    This looks like a simple solution for admob in the short term:
    Bundle extras = new Bundle();
    extras.putString("npa", "1");
     
    AdRequest request = new AdRequest.Builder()
            .addNetworkExtrasBundle(AdMobAdapter.class, extras)
            .build();
    It doesn't require the consent SDK. The extra parameter will serve non-personalised ads.

    https://developers.google.com/admob/android/eu-consent#forward_consent_to_the_google_mobile_ads_sdk

    Likes: Apollo14

    +1 -1 (+1 / -0 ) Share on Facebook
  • simwhisimwhi Member
    As an example, I added some code to the AdsAmob.java file:
        private void requestNewInterstitial(InterstitialAd interstitial){
    	Bundle extras = new Bundle();
    	extras.putString("npa", "1");
     
    	Builder adRequest = new AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter.class, extras);
     
    	if(!testID.equals(""))
            {
                adRequest.addTestDevice(testID);
            }
            interstitial.loadAd(adRequest.build());
        }
    Will this work as a short term fix?

    Likes: Apollo14

    +1 -1 (+1 / -0 ) Share on Facebook
  • simwhisimwhi Member
    HI,

    So after implementing the code from the previous post, I managed to get interstitial ads that seemed random. However, I didn't get any banner ads.

    I'd love to hear your experiences.

    Here is the complete code for AdsAdmob.java:
    package com.giderosmobile.android.plugins.ads.frameworks;
     
    import java.lang.ref.WeakReference;
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Hashtable;
    import android.app.Activity;
    import android.provider.Settings;
    import android.util.SparseArray;
    import android.view.KeyEvent;
    import android.os.Bundle;
     
    import com.giderosmobile.android.plugins.ads.*;
    import com.google.ads.mediation.admob.AdMobAdapter;
    import com.google.android.gms.ads.*;
    import com.google.android.gms.ads.AdRequest.Builder;
    import com.google.android.gms.ads.reward.RewardItem;
    import com.google.android.gms.ads.reward.RewardedVideoAd;
    import com.google.android.gms.ads.reward.RewardedVideoAdListener;
    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.GoogleApiAvailability;
     
    public class AdsAdmob implements AdsInterface {
     
    	private WeakReference sActivity;
    	private String adsID = "";
        private String appID = "";
    	private AdSize currentType = AdSize.BANNER;
    	private String currentName = "banner";
    	private String testID = "";
    	private AdsManager mngr;
    	//rewarded ads and interstitial instance can reused, make as members to access easily
    	private RewardedVideoAd mRewardedAd = null;
        private  String mRewardedVideoAdId = "";
    	private InterstitialAd interstitial = null;
     
    	static AdsAdmob me;
     
    	//all AdMob banner types
    	private Hashtable adTypes;
     
    	public void onCreate(WeakReference activity)
    	{
    		me = this;
    		sActivity = activity;
     
    		adsID = "";
     
    		currentType = AdSize.BANNER;
    		currentName = "banner";
    		testID = "";
     
    		//create ad types
    		mngr = new AdsManager();
    		adTypes = new Hashtable();
    		adTypes.put("banner", AdSize.BANNER);
    		adTypes.put("iab_banner", AdSize.FULL_BANNER);
    		adTypes.put("iab_leaderboard", AdSize.LEADERBOARD);
    		adTypes.put("iab_mrect", AdSize.MEDIUM_RECTANGLE);
    		adTypes.put("iab_skyscaper", AdSize.WIDE_SKYSCRAPER);
    		adTypes.put("smart_banner", AdSize.SMART_BANNER);
    		adTypes.put("auto", AdSize.SMART_BANNER);
    	}
     
    	//on destroy event
    	public void onDestroy()
    	{	
    		mngr.destroy();
     
            if (mRewardedAd != null){
                mRewardedAd.destroy(sActivity.get());
            }
    	}
     
    	public void onStart(){}
     
    	public void onStop(){}
     
    	public void onPause(){
    		if(mngr.get(currentName) != null)
    			((AdView) mngr.get(currentName)).pause();
            if (mRewardedAd != null){
                mRewardedAd.pause(sActivity.get());
            }
    	}
     
    	public void onResume(){
    		if(mngr.get(currentName) != null)
    			((AdView) mngr.get(currentName)).resume();
            if (mRewardedAd != null){
                mRewardedAd.resume(sActivity.get());
            }
    	}
     
    	public boolean onKeyUp(int keyCode, KeyEvent event) {
    		return false;
    	}
     
    	public void setKey(final Object parameters){
    		SparseArray param = (SparseArray)parameters;
    		adsID = param.get(0);
     
            if(param.get(1) != null)  //the second is the appid required by the api
            {
                appID = param.get(1);
                MobileAds.initialize(sActivity.get().getApplicationContext(), appID);
            }
        }
     
        private void requestNewInterstitial(InterstitialAd interstitial){
     
    		Bundle extras = new Bundle();
    		extras.putString("npa", "1");
     
    		Builder adRequest = new AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter.class, extras);
     
    		if(!testID.equals(""))
            {
                adRequest.addTestDevice(testID);
            }
            interstitial.loadAd(adRequest.build());
        }
     
        private void loadRewardedVideoAd(){
     
    		Bundle extras = new Bundle();
    		extras.putString("npa", "1");
     
    		Builder adRequest = new AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter.class, extras);
     
    		//Builder adRequest = new AdRequest.Builder();
    		if(!testID.equals(""))
    		{
    			adRequest.addTestDevice(testID);
    		}
            mRewardedAd.loadAd(mRewardedVideoAdId, adRequest.build());
        }
     
    	//load an Ad
    	public void loadAd(final Object parameters)
    	{
            SparseArray param = (SparseArray)parameters;
            final String type = param.get(0);
            String adPlace = adsID;
            if(param.get(1) != null)
            {
                adPlace = param.get(1);
            }
     
            if(type.equals("interstitial"))
    		{
    			 if (mngr.get(type) == null) {
    				interstitial = new InterstitialAd(sActivity.get());
     
    				mngr.set(interstitial, type, new AdsStateChangeListener() {
    					<a href="/profile/Override">@Override</a>
    					public void onShow() {
     
    						if (interstitial.isLoaded()) {
    							Ads.adDisplayed(me, type);
    							interstitial.show();
    						}
    					}
     
    					<a href="/profile/Override">@Override</a>
    					public void onDestroy() {
     
    					}
     
    					<a href="/profile/Override">@Override</a>
    					public void onHide() {
     
    					}
     
    					<a href="/profile/Override">@Override</a>
    					public void onRefresh() {
    					   requestNewInterstitial(interstitial);
    					}
    				});
    				 // interstitial should be reused
    				 mngr.setAutoKill(type, false);
    				 mngr.setPreLoad(type, true);
    				 interstitial.setAdUnitId(adPlace);
    				 interstitial.setAdListener(new AdsAdmobListener(mngr.getState(type)));
     
    				 requestNewInterstitial(interstitial);
    			}else if (interstitial != null){
    				 requestNewInterstitial(interstitial);
    			 }
    		}
    		else if(type.equals("rewarded"))
    		{
    			if (mngr.get(type) == null) {
    				mRewardedVideoAdId = adPlace;
    				mRewardedAd = MobileAds.getRewardedVideoAdInstance(sActivity.get());
     
    				mngr.set(mRewardedAd, "rewarded", new AdsStateChangeListener() {
    					<a href="/profile/Override">@Override</a>
    					public void onShow() {
    						if (mRewardedAd.isLoaded()) {
    							Ads.adDisplayed(me, type);
    							mRewardedAd.show();
    						}
    					}
     
    					<a href="/profile/Override">@Override</a>
    					public void onDestroy() {
     
    					}
     
    					<a href="/profile/Override">@Override</a>
    					public void onHide() {
     
    					}
     
    					<a href="/profile/Override">@Override</a>
    					public void onRefresh() {
    						loadRewardedVideoAd();
    					}
    				});
     
    				mRewardedAd.setRewardedVideoAdListener(new AdsAdmobRewardedVideoAdListener(mngr.getState(type)));
    				mngr.setAutoKill(type, false);
    				mngr.setPreLoad(type, true);
    				loadRewardedVideoAd();
    			}else if(mRewardedAd != null){
    				loadRewardedVideoAd();
    			}
    		}
    		else  //banner
    		{
    			if(adTypes.get(type) != null)
    			{
    				//if there is an existing ad view
    				//destroy it
    				if(mngr.get(type) == null)
    				{
    					// Create the adView with your publisher ID and type
    					final AdView adView = new AdView(sActivity.get());
    					mngr.set(adView, type, new AdsStateChangeListener(){
     
    						<a href="/profile/Override">@Override</a>
    						public void onShow() {
    							Ads.adDisplayed(me, type);
    							currentName = type;
    							currentType = adTypes.get(type);
    							Ads.addAd(AdsAdmob.me, adView);
    						}
    						<a href="/profile/Override">@Override</a>
    						public void onDestroy() {
    							 hideAd(type);
    							 adView.destroy();
    						}
     
    						<a href="/profile/Override">@Override</a>
    						public void onHide() {
    							Ads.removeAd(AdsAdmob.me, adView);
    							Ads.adDismissed(AdsAdmob.me, type);
    						}
     
    						<a href="/profile/Override">@Override</a>
    						public void onRefresh() {
     
    						}
     
    					});
    					mngr.setAutoKill(type, false);
    					adView.setAdUnitId(adPlace);
    					adView.setAdSize(adTypes.get(type));
     
    					Bundle extras = new Bundle();
    					extras.putString("npa", "1");
     
    					Builder adRequest = new AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter.class, extras);
     
    //					Builder adRequest = new AdRequest.Builder();
    					if(!testID.equals(""))
    						adRequest.addTestDevice(testID);
     
    					adView.setAdListener(new AdsAdmobListener(mngr.getState(type)));
    					adView.loadAd(adRequest.build());
    				}
    			}
    			else
    			{
    				Ads.adError(this, "Unknown type: " + type);
    			}
    		}
    	}
     
    	public void showAd(final Object parameters)
    	{
    		SparseArray param = (SparseArray)parameters;
    		String type = param.get(0);
    		if(mngr.get(type) == null)
    		{
    			loadAd(parameters);
    		}
    		mngr.show(type);
    	}
     
    	//remove ad
    	public void hideAd(String type)
    	{
    		mngr.hide(type);
    	}
     
    	public int getWidth(){
    		return currentType.getWidthInPixels(sActivity.get());
    	}
     
    	public int getHeight(){
    		return currentType.getHeightInPixels(sActivity.get());
    	}
     
    	private boolean checkAvailable(){
    		//return GooglePlayServicesUtil.isGooglePlayServicesAvailable(sActivity.get())== ConnectionResult.SUCCESS;
            GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
            int result = googleApiAvailability.isGooglePlayServicesAvailable(sActivity.get());
            if (result != ConnectionResult.SUCCESS) {
                if (googleApiAvailability.isUserResolvableError(result)) {
                    googleApiAvailability.getErrorDialog(sActivity.get(), result, 9000).show();
                }
     
                return false;
            }
     
            return true;
    	}
     
    	<a href="/profile/Override">@Override</a>
    	public void enableTesting() {
    		String aid = Settings.Secure.getString(sActivity.get().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);
    		}
     
    		testID = obj.toString();
    	}
     
    }
     
    class AdsAdmobListener extends AdListener{
     
    	private AdsState state;
     
    	AdsAdmobListener(AdsState type){
    		state = type;
    	}
     
    	public void onAdLoaded(){
    		Ads.adReceived(AdsAdmob.me, state.getType());
    		state.load();
    	}
     
    	public void onAdFailedToLoad(int errorCode){
    		if(AdRequest.ERROR_CODE_INTERNAL_ERROR == errorCode)
    			Ads.adFailed(AdsAdmob.me, state.getType(), "Internal error");
    		else if(AdRequest.ERROR_CODE_INVALID_REQUEST == errorCode)
    			Ads.adFailed(AdsAdmob.me, state.getType(), "Invalid request");
    		else if(AdRequest.ERROR_CODE_NETWORK_ERROR == errorCode)
    			Ads.adFailed(AdsAdmob.me, state.getType(), "Network error");
    		else if(AdRequest.ERROR_CODE_NO_FILL == errorCode)
    			Ads.adFailed(AdsAdmob.me, state.getType(), "No fill");
    	}
     
    	public void onAdOpened(){
    		Ads.adActionBegin(AdsAdmob.me, state.getType());
    	}
     
    	public void onAdClosed(){
    		String type = state.getType();
    		Ads.adActionEnd(AdsAdmob.me, type);
    		if(type.equals("interstitial")){
    			Ads.adDismissed(AdsAdmob.me, type);
                state.refresh();
    		}
    	}
     
    	public void onAdLeftApplication(){
     
    	}
    }
     
     
    class AdsAdmobRewardedVideoAdListener implements RewardedVideoAdListener{
        private AdsState state;
     
        AdsAdmobRewardedVideoAdListener(AdsState type){
            state = type;
        }
     
        <a href="/profile/Override">@Override</a>
        public void onRewarded(RewardItem reward) {
            Ads.adRewarded(AdsAdmob.me, state.getType(), reward.getAmount());
        }
     
        <a href="/profile/Override">@Override</a>
        public void onRewardedVideoAdLeftApplication() {
     
        }
     
        <a href="/profile/Override">@Override</a>
        public void onRewardedVideoAdClosed() {
            String type = state.getType();
            Ads.adActionEnd(AdsAdmob.me, type);
            if(type.equals("rewarded")){
                Ads.adDismissed(AdsAdmob.me, type);
                state.refresh();
            }
        }
     
        <a href="/profile/Override">@Override</a>
        public void onRewardedVideoAdFailedToLoad(int errorCode) {
            if(AdRequest.ERROR_CODE_INTERNAL_ERROR == errorCode)
                Ads.adFailed(AdsAdmob.me, state.getType(), "Internal error");
            else if(AdRequest.ERROR_CODE_INVALID_REQUEST == errorCode)
                Ads.adFailed(AdsAdmob.me, state.getType(), "Invalid request");
            else if(AdRequest.ERROR_CODE_NETWORK_ERROR == errorCode)
                Ads.adFailed(AdsAdmob.me, state.getType(), "Network error");
            else if(AdRequest.ERROR_CODE_NO_FILL == errorCode)
                Ads.adFailed(AdsAdmob.me, state.getType(), "No fill");
        }
     
        <a href="/profile/Override">@Override</a>
        public void onRewardedVideoAdLoaded() {
            Ads.adReceived(AdsAdmob.me, state.getType());
            state.load();
        }
     
        <a href="/profile/Override">@Override</a>
        public void onRewardedVideoAdOpened() {
            Ads.adActionBegin(AdsAdmob.me, state.getType());
        }
     
        <a href="/profile/Override">@Override</a>
        public void onRewardedVideoStarted() {
        }
     
    }
  • dreiko65dreiko65 Member
    Today I checked the game "Love Balls". Before the game begins there is a small notice from the developers asking for the user's consent to use data and serve ads. Can this be done in Gideros? Thanks
  • totebototebo Member
    That's interesting. Of course you could do this yourself, the easiest option is probably AlertDialog: http://docs.giderosmobile.com/reference/gideros/AlertDialog#AlertDialog

    It allows you to pop a native alert, where you can ask for permission. Is that what you meant?
    My Gideros games: www.totebo.com
  • SinisterSoftSinisterSoft Maintainer
    The problem is that if you actually ask for consent then you also then have to provide functions for 'the right to be forgotten' and the 'right for a copy of your data in machine readable format' - both of which are currently impossible with the advertising api that are provided by the advertisers.

    Likes: antix, totebo, MobAmuse

    +1 -1 (+3 / -0 ) Share on Facebook
Sign In or Register to comment.