For more information, please refer to the Privacy Compliance Guide
To comply with the relevant regulations of the Personal Information Protection Law, an API is provided to disable personalized ad recommendations.
Currently, the ad platforms supported by the personalization switch setting are: Pangle (China), GDT, Kuaishou, Baidu, Huawei, Mintegral, Sigmob. By default, all ad personalized recommendations are enabled. If you manually set it to disabled, personalized recommendations will be disabled for all ad platforms.
//status:
//ATAdConst.PRIVACY.PERSIONALIZED_ALLOW_STATUS: Enable personalized recommendations (Default)
//ATAdConst.PRIVACY.PERSIONALIZED_LIMIT_STATUS: Block personalized recommendations
int status = ATAdConst.PRIVACY.PERSIONALIZED_ALLOW_STATUS;
ATSDK.setPersonalizedAdStatus(status);
① To ensure your app passes reviews smoothly and in light of current regulatory focus, we can place the Taku SDK Initialization after the user agrees to the privacy policy.
② If higher requirements are needed, the following methods can be used for control. Restricting user device data reporting may affect ad fill, so please use with caution.
(1) By default, the Taku SDK collects the following user data:
① Commonly collected data: System Version Name, System Version Code, App Package Name, App Version Name, App Version Code, Device Manufacturer, Device Model, Screen Resolution, Mobile Network Code, Mobile Country Code, Language, Time Zone, User Agent, Screen Orientation, Network Type, App Install Source, Accelerometer Sensor
② Additionally collected data for China-region SDK: MAC Address, International Mobile Equipment Identity (IMEI), OAID, CPU Model Info, System Boot ID, System Update ID, Whether Device is Rooted, Whether Device Uses Proxy, SSID of Connected WiFi, Android ID, Google Ad ID, IMSI
③ Additionally collected data for non-China-region SDK: Google Ad ID, Android ID (versions below v6.1.80 collect Android ID by default; starting from v6.1.80, it is no longer collected)
(2) The Taku SDK provides APIs for developers to restrict the reporting of this privacy data. When developers restrict the reported device data, it may affect the normal functionality of Taku, such as Traffic Grouping, Cross-Promotion, Taku Adx, etc. Developers should set this carefully.
(3) If GDPR consent is not granted, only the following will be collected: Phone System Version Name, Screen Orientation, Version of the TopOn SDK integrated into the app.
// Call this code before Initializing the SDK to restrict the reporting of device privacy data. The information passed in will be restricted from reporting.
ATSDK.deniedUploadDeviceInfo(
DeviceDataInfo.DEVICE_SCREEN_SIZE // Screen Resolution
, DeviceDataInfo.ANDROID_ID // Android ID
, DeviceDataInfo.APP_PACKAGE_NAME // App Package Name
, DeviceDataInfo.APP_VERSION_CODE // App Version Code
, DeviceDataInfo.APP_VERSION_NAME // App Version Name
, DeviceDataInfo.BRAND // Device Manufacturer
, DeviceDataInfo.GAID // Google Ad ID
, DeviceDataInfo.LANGUAGE // Language
, DeviceDataInfo.MCC // Mobile Country Code
, DeviceDataInfo.MNC // Mobile Network Code
, DeviceDataInfo.MODEL // Device Model
, DeviceDataInfo.ORIENTATION // Screen Orientation
, DeviceDataInfo.OS_VERSION_CODE // System Version Code
, DeviceDataInfo.OS_VERSION_NAME // System Version Name
, DeviceDataInfo.TIMEZONE // Time Zone
, DeviceDataInfo.USER_AGENT // User Agent
, DeviceDataInfo.NETWORK_TYPE // Network Type
, DeviceDataInfo.INSTALLER // App Install Source
, ChinaDeviceDataInfo.MAC // MAC Address
, ChinaDeviceDataInfo.IMEI // International Mobile Equipment Identity
, ChinaDeviceDataInfo.OAID // OAID
, ChinaDeviceDataInfo.SSID // SSID
, ChinaDeviceDataInfo.IMSI // IMSI
);
(4) (Added in v6.4.40) The Taku SDK provides an API to pass an existing device ID to the Taku SDK. Example:
ATUserDeviceInfo atUserDeviceInfo = new ATUserDeviceInfo();
atUserDeviceInfo.setDevGaid("Pass the Gaid obtained in advance here");
atUserDeviceInfo.setDevOaid("Pass the Oaid obtained in advance here");
atUserDeviceInfo.setDevImei("Pass the Imei obtained in advance here");
// Call before Taku SDK Initialization
ATSDK.setATUserDeviceInfo(atUserDeviceInfo);
TTATInitManager.getInstance().setTtCustomController(new TTCustomController() {
/**
* Whether to allow the Pangle (China) SDK to actively use geographic location information
*
* @return true: allowed, false: prohibited. Default is true
*/
@Override
public boolean isCanUseLocation() {
return super.isCanUseLocation();
}
/**
* When isCanUseLocation=false, geographic location information can be passed in. The Pangle (China) SDK will use the geographic location information you provide.
*
* @return Geographic location parameters
*/
@Override
public LocationProvider getTTLocation() {
return super.getTTLocation();
}
/**
* Whether to allow the Pangle (China) SDK to actively acquire the collection permission for the installed app list on the device
*
* @return true: allowed, false: prohibited. Default is true
*/
@Override
public boolean alist() {
return super.alist();
}
/**
* Whether to allow the Pangle (China) SDK to actively use phone hardware parameters, such as IMEI
*
* @return true: allowed, false: prohibited. Default is true
*/
@Override
public boolean isCanUsePhoneState() {
return super.isCanUsePhoneState();
}
/**
* When isCanUsePhoneState=false, IMEI information can be passed in. The Pangle (China) SDK will use the IMEI information you provide.
*
* @return IMEI information
*/
@Override
public String getDevImei() {
return super.getDevImei();
}
/**
* Whether to allow the Pangle (China) SDK to actively use the ACCESS_WIFI_STATE permission
*
* @return true: allowed, false: prohibited. Default is true
*/
@Override
public boolean isCanUseWifiState() {
return super.isCanUseWifiState();
}
/**
* Mac information can be passed in. The Pangle (China) SDK will use the Mac information you provide.
*
* @return Mac information
*/
@Override
public String getMacAddress() {
return super.getMacAddress();
}
/**
* Whether to allow the Pangle (China) SDK to actively use the WRITE_EXTERNAL_STORAGE permission
*
* @return true: allowed, false: prohibited. Default is true
*/
@Override
public boolean isCanUseWriteExternal() {
return super.isCanUseWriteExternal();
}
/**
* Developers can pass in OAID.
* CAICT OAID related collection —— How to obtain OAID:
1. Mobile Security Alliance official website: http://www.msa-alliance.cn/
2. CAICT Unified SDK download: http://msa-alliance.cn/col.jsp?id=120
* @return OAID
*/
@Override
public String getDevOaid() {
return super.getDevOaid();
}
});
// Disable install listener switch in app backend:
Map<String,Boolean> params = new HashMap<>();
params.put("hieib", false);
GlobalSetting.setConvOptimizeInfo(params);
GDTATInitManager.getInstance().setGDTATCustomController(new GDTATCustomController() {
/*
* Whether the user agrees to the privacy policy, default is true
* */
@Override
public boolean getAgreePrivacyStrategy() {
return super.getAgreePrivacyStrategy();
}
});
/* * Use this method to pass in geographic location information or WeChat OpenID information * */
GlobalSetting.setExtraUserData(Map extraUserData);
/* * Use this method to block the GDT SDK from acquiring the installed app list on the device * */
GlobalSetting.setEnableCollectAppInstallStatus(false);
KSATInitManager.getInstance().setKSATCustomController(new KSATCustomController() {
/*
* Whether to allow the Kuaishou SDK to actively use ICCID, default is true
* */
@Override
public boolean getCanReadICCID() {
return super.getCanReadICCID();
}
/*
* Whether to allow the Kuaishou SDK to actively use Mac Address, default is true
* */
@Override
public boolean getCanReadMacAddress() {
return super.getCanReadMacAddress();
}
/*
* Whether to allow the Kuaishou SDK to actively use the nearby WiFi list, default is true
* */
@Override
public boolean getCanReadNearbyWifiList() {
return super.getCanReadNearbyWifiList();
}
/*
* For more privacy data switches, refer to the "3.5 Privacy Info Control Switch" section
* in the documentation: https://p1-web.adkwai.com/udata/pkg/KS-Android-KSAdSDk/doc/4701b963d40a77bc0f45fd71d30b57da352.pdf
* */
@Override
public KsCustomController getKsCustomeController() {
return super.getKsCustomeController();
}
});
//(v6.4.19 and above) Disable install listener switch in app backend:
BDAdConfig.Builder bdAdConfigBuilder = new BDAdConfig.Builder();
bdAdConfigBuilder.putExtraParam("pk_change_rc","false");
bdAdConfigBuilder.putExtraParam("mi_market_rc","false");
BaiduATInitManager.getInstance().setBDAdConfigBuilder(bdAdConfigBuilder);
BaiduATInitManager.getInstance().setBaiduATCustomController(new BaiduATCustomController() {
/*
* Allow the Baidu SDK to obtain the device ID, such as IMEI
* */
@Override
public boolean getPermissionReadDeviceID() {
return super.getPermissionReadDeviceID();
}
/*
* Allow the Baidu SDK to use the location permission
* */
@Override
public boolean getPermissionLocation() {
return super.getPermissionLocation();
}
/*
* Allow the Baidu SDK to use storage space
* */
@Override
public boolean getPermissionStorage() {
return super.getPermissionStorage();
}
/*
* Allow the Baidu SDK to use the permission to obtain the installed app list
* */
@Override
public boolean getPermissionAppList() {
return super.getPermissionAppList();
}
/*
* Allow the Baidu SDK to use OAID
* */
@Override
public boolean getPermissionOAID() {
return super.getPermissionOAID();
}
/*
* Allow the Baidu SDK to use device info
* */
@Override
public boolean getPermissionDeviceInfo() {
return super.getPermissionDeviceInfo();
}
/*
* Set whether the Baidu SDK is allowed to obtain APP update permissions
* */
@Override
public boolean getPermissionAppUpdate() {
return super.getPermissionAppUpdate();
}
/*
* Set whether the Baidu SDK is allowed to obtain the running app permission
* */
@Override
public boolean getPermissionRunningApp() {
return super.getPermissionRunningApp();
}
});
KlevinATInitManager.getInstance().setKlevinCustomController(new KlevinCustomController() {
/**
* Whether to allow the SDK to collect geographic location information
* @return true: SDK collects location info, false: SDK does not obtain location info. Default is true
*/
public boolean isCanUseLocation() {
return true;
}
/**
* When isCanUseLocation is false, the APP can pass in geographic location information. The YouKeYing SDK will use the geographic location information you provide.
* @return Geographic location parameters
*/
public Location getLocation() {
return null;
}
/**
* Whether to allow the SDK to collect phone hardware parameters, such as IMEI
* @return true: SDK collects IMEI, false: SDK does not collect IMEI. Default is true
*/
public boolean isCanUsePhoneState() {
return true;
}
/**
* When isCanUsePhoneState is false, the developer can pass in IMEI information. The YouKeYing SDK will use the IMEI information you provide, and the SDK will not collect it internally.
* @return IMEI information
*/
public String getDevImei() {
return null;
}
/**
* Whether to allow the SDK to actively use the ACCESS_WIFI_STATE permission
* @return true: allowed, false: prohibited. Default is true
*/
public boolean isCanUseWifiState() {
return true;
}
/**
* Developers can pass in OAID.
* CAICT OAID related collection —— How to obtain OAID:
1. Mobile Security Alliance official website: http://www.msa-alliance.cn/
2. CAICT Unified SDK download: http://msa-alliance.cn/col.jsp?id=120
* @return OAID
*/
public String getDevOaid() {
return null;
}
});
TapATInitManager.getInstance().setTapAdCustomController(new TapAdCustomController() {
// Whether to allow the SDK to actively use geographic location information
@Override
public boolean isCanUseLocation() {
return true;
}
// When isCanUseLocation=false, geographic location information can be passed in. TapAd will use the geographic location information you provide.
@Override
public TapAdLocation getTapAdLocation() {
return null;
}
// Whether to allow the SDK to actively use phone hardware parameters, such as IMEI
@Override
public boolean isCanUsePhoneState() {
return true;
}
// When isCanUsePhoneState=false, IMEI information can be passed in. TapAd will use the IMEI information you provide.
@Override
public String getDevImei() {
return null;
}
// Whether to allow the SDK to actively use the ACCESS_WIFI_STATE permission
@Override
public boolean isCanUseWifiState() {
return true;
}
// Whether to allow the SDK to actively use the WRITE_EXTERNAL_STORAGE permission
@Override
public boolean isCanUseWriteExternal() {
return true;
}
// Developers can pass in OAID.
// CAICT OAID related collection —— How to obtain OAID:
// 1. Mobile Security Alliance official website: http://www.msa-alliance.cn/
// 2. CAICT Unified SDK download: http://msa-alliance.cn/col.jsp?id=120
@Override
public String getDevOaid() {
return null;
}
// Whether to allow the SDK to actively acquire the collection permission for the installed app list on the device
@Override
public boolean alist() {
return true;
}
// Whether to allow the SDK to actively obtain ANDROID_ID
@Override
public boolean isCanUseAndroidId() {
return true;
}
@Override
public CustomUser provideCustomUser() {
return null;
}
});
JADATInitManager.getInstance().setJADPrivateController(new JADPrivateController() {
/**
* Developers can pass in OAID.
*
* @return OAID
*/
@Override
public String getOaid() {
return null;
}
/**
* Whether to allow the SDK to actively use geographic location information
*
* @return true: allowed, false: prohibited. Default is true
*/
@Override
public boolean isCanUseLocation() {
return true;
}
/**
* When isCanUseLocation=false, geographic location information can be passed in. The SDK will use the geographic location information you provide.
*
* @return Geographic location parameters
*/
@Override
public JADLocation getLocation() {
return new JADLocation(-1.0, -1.0, -1.0);
}
/**
* Whether to allow the SDK to actively use phone hardware parameters, such as IMEI
*
* @return true: allowed, false: prohibited. Default is true
*/
@Deprecated
public boolean isCanUsePhoneState() {
return false;
}
/**
* When isCanUsePhoneState=false,
* IMEI information can be passed in. The SDK will use the IMEI information you provide.
*
* @return IMEI information
*/
@Override
public String getImei() {
return "";
}
/**
* Whether to allow the SDK to actively use IP information
* @return true: allowed, false: prohibited. Default is true
*/
@Override
public boolean isCanUseIP() {
return true;
}
/**
* When isCanUseIP=false,
* IP information can be passed in. The SDK will use the IP information you provide.
*
* @return IP
*/
@Override
public String getIP() {
return "0.0.0.0";
}
});
QMATInitManager.getInstance().setQMCustomControl(new QMCustomControl() {
@Override
public String getDevImei() {
return super.getDevImei();
}
@Override
public String getDevImsi() {
return super.getDevImsi();
}
@Override
public String getAndroidId() {
return super.getAndroidId();
}
@Override
public String getMacAddress() {
return super.getMacAddress();
}
@Override
public boolean isCanUsePhoneState() {
return super.isCanUsePhoneState();
}
@Override
public boolean isCanUseAppList() {
return super.isCanUseAppList();
}
@Override
public boolean isCanUseAndroidId() {
return super.isCanUseAndroidId();
}
@Override
public List getAppList() {
return super.getAppList();
}
@Override
public String getOaid() {
return super.getOaid();
}
@Override
public boolean isCanUseOaid() {
return super.isCanUseOaid();
}
@Override
public IQLocation getQLocation() {
return super.getQLocation();
}
});
OppoATInitManager.getInstance().setCustomController(new MobCustomController() {
@Override
public String getDevImei() {
return super.getDevImei();
}
@Override
public boolean isCanUseLocation() {
return super.isCanUseLocation();
}
@Override
public LocationProvider getLocation() {
return super.getLocation();
}
@Override
public boolean isCanUsePhoneState() {
return super.isCanUsePhoneState();
}
@Override
public boolean isCanUseAndroidId() {
return super.isCanUseAndroidId();
}
@Override
public String getAndroidId() {
return super.getAndroidId();
}
@Override
public boolean isCanUseWifiState() {
return super.isCanUseWifiState();
}
@Override
public String getMacAddress() {
return super.getMacAddress();
}
@Override
public boolean isCanUseWriteExternal() {
return super.isCanUseWriteExternal();
}
@Override
public boolean alist() {
return super.alist();
}
});
VivoATInitManager.getInstance().setCustomController(new VCustomController() {
@Override
public boolean isCanUseLocation() {
return super.isCanUseLocation();
}
@Override
public VLocation getLocation() {
return super.getLocation();
}
@Override
public boolean isCanUsePhoneState() {
return super.isCanUsePhoneState();
}
@Override
public String getImei() {
return super.getImei();
}
@Override
public boolean isCanUseWriteExternal() {
return super.isCanUseWriteExternal();
}
@Override
public boolean isCanPersonalRecommend() {
return super.isCanPersonalRecommend();
}
@Override
public boolean isCanUseImsi() {
return super.isCanUseImsi();
}
@Override
public boolean isCanUseApplist() {
return super.isCanUseApplist();
}
@Override
public boolean isCanUseAndroidId() {
return super.isCanUseAndroidId();
}
@Override
public boolean isCanUseMac() {
return super.isCanUseMac();
}
@Override
public boolean isCanUseIp() {
return super.isCanUseIp();
}
});
MiMoATInitManager.getInstance().setCustomController(new MiMoCustomController() {
@Override
public String getDevImei() {
return super.getDevImei();
}
@Override
public String getDevOaid() {
return super.getDevOaid();
}
@Override
public boolean isCanUsePhoneState() {
return super.isCanUsePhoneState();
}
@Override
public boolean isCanUseLocation() {
return super.isCanUseLocation();
}
@Override
public MiMoLocation getLocation() {
return super.getLocation();
}
@Override
public boolean isCanUseAndroidId() {
return super.isCanUseAndroidId();
}
@Override
public String getAndroidId() {
return super.getAndroidId();
}
@Override
public boolean canUseMacAddress() {
return super.canUseMacAddress();
}
@Override
public boolean canUseNetworkState() {
return super.canUseNetworkState();
}
@Override
public boolean canUseStoragePermission() {
return super.canUseStoragePermission();
}
@Override
public boolean canReadInstalledPackages() {
return super.canReadInstalledPackages();
}
@Override
public boolean isCanUsePermissionRecordAudio() {
return super.isCanUsePermissionRecordAudio();
}
});
MeishuATInitManager.getInstance().setCustomController(new MeishuCustomController() {
@Override
public String getDevImei() {
return super.getDevImei();
}
@Override
public String getDevOaid() {
return super.getDevOaid();
}
@Override
public boolean isCanUsePhoneState() {
return super.isCanUsePhoneState();
}
@Override
public boolean isCanUseLocation() {
return super.isCanUseLocation();
}
@Override
public boolean isCanUseAndroidId() {
return super.isCanUseAndroidId();
}
@Override
public String getAndroidId() {
return super.getAndroidId();
}
});
TanxATInitManager.getInstance().setCustomController(new TanxATCustomController() {
@Override
public String getImei() {
return super.getImei();
}
@Override
public String getOaid() {
return super.getOaid();
}
@Override
public boolean oaidSwitch() {
return super.oaidSwitch();
}
@Override
public boolean imeiSwitch() {
return super.imeiSwitch();
}
@Override
public boolean idAllSwitch() {
return super.idAllSwitch();
}
});
BzATInitManager.getInstance().setBeiZiCustomController(new BeiZiCustomController() {
@Override
public boolean isCanUseLocation() {
return super.isCanUseLocation();
}
@Override
public BeiZiLocation getLocation() {
return super.getLocation();
}
@Override
public boolean isCanUseWifiState() {
return super.isCanUseWifiState();
}
@Override
public boolean isCanUsePhoneState() {
return super.isCanUsePhoneState();
}
@Override
public boolean isCanUseOaid() {
return super.isCanUseOaid();
}
@Override
public boolean isCanUseGaid() {
return super.isCanUseGaid();
}
@Override
public String getDevOaid() {
return super.getDevOaid();
}
@Override
public String getOaidVersion() {
return super.getOaidVersion();
}
@Override
public boolean isCanUseAppList() {
return super.isCanUseAppList();
}
@Override
public boolean forbidSensor() {
return super.forbidSensor();
}
@Override
public boolean isCanUseAndroidId() {
return super.isCanUseAndroidId();
}
@Override
public String getAndroidId() {
return super.getAndroidId();
}
});
In compliance scenarios, download-type ads need to prompt the user before downloading, and the user must confirm before the download can begin.
During ad playback, when a click triggers an ad download, the developer needs to obtain the app name, version, and related information to display a popup prompting the user whether to confirm the download.
Applicable ad types: All ad types
Applicable ad platforms: GDT, Pangle (China), Kuaishou (need to contact Kuaishou to enable the feature), Mintegral China (need to contact Mintegral to enable the feature), Sigmob (need to contact Sigmob to enable the feature), YouKeYing (download-type ads will automatically popup; if you want to disable the feature, contact the third-party).
You can contact GDT to apply (recommended), or set it yourself via code.
① If the developer's application for secondary popup permission is confirmed successful, no code setup is needed.
② Using code setup requires the developer to draw the popup themselves and prompt the user whether to confirm the download.
③ After enabling, the onDownloadConfirm logic in ATSplashExListener must be handled, otherwise clicks will have no response.
Taking Splash Ad as an example, sample code as follows:
ATSplashAd splashAd = new ATSplashAd(this, placementId, atMediationRequestInfo, new ATSplashExListener() {
@Override
public void onDownloadConfirm(Context context, ATAdInfo adInfo, ATNetworkConfirmInfo networkConfirmInfo) {
if (networkConfirmInfo instanceof GDTDownloadFirmInfo) {
// Secondary popup handling. DownloadApkConfirmDialogWebView is the class for drawing the secondary confirmation popup. Specific rendering needs to be done by the developer.
new DownloadApkConfirmDialogWebView(context, ((GDTDownloadFirmInfo) networkConfirmInfo).appInfoUrl, ((GDTDownloadFirmInfo) networkConfirmInfo).confirmCallBack).show();
}
}
....
}, 5000);
Map localMap = new HashMap<>();
localMap.put(ATAdConst.KEY.AD_WIDTH, layoutParams.width);
localMap.put(ATAdConst.KEY.AD_HEIGHT, layoutParams.height);
// Enable secondary popup confirmation download after clicking app-type ads (set to false to disable)
localMap.put(ATAdConst.KEY.AD_CLICK_CONFIRM_STATUS, true);
splashAd.setLocalExtra(localMap);
GDTDownloadFirmInfo API Description:
| Variable | Description |
|---|---|
| scenes | The scene where the download occurs. Scene constants defined by the ApkDownloadComplianceInterface: SCENES_AD_OR_NATIVE_LANDING_PAGE (indicates the download scene is clicking the ad itself or a native landing page), SCENES_WEB_LANDING_PAGE (indicates the download scene is clicking the landing page). |
| appInfoUrl | The URL address of the application info to be downloaded. |
| confirmCallBack | The developer uses this callBack to notify the SDK whether to continue the download or cancel it. onConfirm: Confirm download; onCancel: Cancel download. |
List<String> networkFirmIdList = new ArrayList<>();
// Supported platforms (Pangle China, Gromroe, GDT, Kuaishou, Tanx, Qumeng, Sigmob, Meishu, TapTap, ADX, Beizi, Octopus)
// Pass in the platform ID of the specified ad platform.
// networkFilmIdList.add("network_firm_id");
// Except when passing ALLOW_NETWORK which requires networkFirmIdList, the other three types do not need it.
// Control types: (FORBID_ALL: Forbid all, ALLOW_ALL: Allow all, ALLOW_NETWORK: Allow channels in the List to be enabled, other channels are forbidden, DEFAULT_NETWORK: All follow the channel's default value)
// v6.5.09+, recommended to call after Initialization and before loading.
// Note: Beizi and Octopus require v6.5.36+, Beizi version: 5.2.2.0, Octopus version: 2.5.10.5 for these two versions to take effect.
// Xiaomi Alliance supported since v6.6.30
ATSDKGlobalSetting.setShakeControl(ATSDKGlobalSetting.SHAKE_TYPE.ALLOW_NETWORK,networkFirmIdList);