状况
我的应用中有一组功能,根据安装的商店进行更改。例如。我想为家庭观众和儿童展示一组更受限制的广告,以便有资格获得Google Play for Education
类别。在其他商店,我仍然希望限制,但不要像过滤广告一样严格。
我最终的观察结果是,如果我选择加入Google Play for Education"由于以下内容(如开发人员控制台所述),因此需要花费几个小时才能发布:
选中此框会提交此应用以包含在"教育工具中 推荐" Google Play for Education部分。最后的决定 推荐的应用程序由第三方教师网络制作。 如果您的应用被选中,我们将通过电子邮件通知您。如果没有,你的 应用程序仍可在Google Play for Education中搜索。
现在,在应用程序在此类别中发布教师网络之前,我假设,下载并测试/验证是否符合指南并且没有违规行为。
问题
要区分从我安装的商店,显然使用它:
PackageManager packageManager = context.getPackageManager();
String installer = packageManager.getInstallerPackageName(packageName);
if (installer == null) installer = ""; //to avoid NPE
if (installer.equals("com.android.vending")) {
//It is installed from Google Play store
//PROBLEM: THIS DOES NOT SEEM TO BE THE PACKAGE NAME RETURNED
//WHEN GOOGLE PLAY REVIEWERS/TESTERS ARE USING THE APP
}
else ...
....
....
//similarly handling other stores here
....
....
....
//After that also checking by installed app stores
....
....
正在发生的事情:在发布之后,应用程序正确识别出它是从Play商店下载的,即它获得com.android.vending
作为installerPackageName。但是,当它被教师网络审查或测试时,它似乎获得了不同的installerPackageName。这导致应用认为它已从Google Play商店以外的应用商店下载。因此,我的应用被拒绝接受教育类别。我需要知道这个安装程序包名称才能正确处理方案。
我如何知道这一点:当检测到的应用商店是Google Play时,我有一个专用的广告单元ID,所有发布成功后的请求(即来自常规游戏商店的用户)都会来这个谷歌专用广告单元ID。但是,在提交应用/更新后,应用程序或更新发布之前的短时间内,一些请求进入非Google广告单元ID,导致应用无法遵守符合条件的指南" Google Play for Education"类别。因为,非Google广告单元ID中的广告过滤级别略低。因此,评估/测试应用程序的教师会看到一些他们认为不符合指南的广告并拒绝它。
另外,here is an article支持在应用程序实际发布到商店之前手动审核应用程序以及自动脚本的事实。
目前的修复或限制:我已禁用所有其他广告网络,并且只能使用admob。即使在其他广告网络中最严格的级别设置过滤器似乎也无法过滤Google评论员认为不适合儿童和家庭受众的所有广告。当只使用admob时,过程很顺利,我总是有资格。
我正在寻找什么来解决这个问题:如果我知道安装应用时返回的installerPackageName,那么教师的审核网络从哪里安装应用程序,当我得到com.android.vending
并且一切都会好的时候,我可以完全像处理那样处理那个案子。
我找不到任何文档或参考资料来获取这些信息。
此外,如果还有其他方式我可以识别该应用程序处于pending publication
阶段,我会强制所有请求转到Google广告单元ID。
假设:审核人员和测试人员有一个单独的安装程序应用程序(自动/手动可能在后台的任何内容),其installerPackageName不是com.android.vending
。如果周围有一些谷歌人,可以帮助确认这一点(如果谷歌允许),请做出评论。 : - )
我不想使用的其他可能性
在应用处于pending publication
阶段时手动停用所有其他网络,并在发布后重新启用它们。但是,我不想这样做,因为这就像虚张声势谷歌,我不想这样做。我希望我的app逻辑能够处理它,以便在市场上发布被审查的相同内容。
我永远坚持只有admob。但这是愚蠢的,因为在我发布我的应用程序的其他商店中没有这样的限制,而且我的填充率会非常糟糕。
我有任何人在或之前遇到此问题的人知道审核的下载地点的installerPackageName 或知道如何确定该应用目前是否在'在playstore上发布`状态?
我也可以使用以com.android
或com.google
开头的包名来过滤所有内容,但我希望将其保留为最后一个选项。此外,想知道在这些用户的情况下是否根本没有设置installerPackage名称。在这种情况下,我需要看一个完全不同的情况来处理这种情况。
答案 0 :(得分:1)
在这种情况下,我发现有一件事可以帮到你。它的分析。只需创建自定义事件,例如。在某些分析系统中安装INSTALLER_STRING并在适当时记录该事件。以下是Fabric Answers中事件记录的示例。
public static final String EVENT_OPEN_TOP_TRENDS = "EVENT_OPEN_TOP_TRENDS";
public static final String TOP_TRENDS_TYPE = "TOP_TRENDS_TYPE";
public static final String TYPE_TOP_TRENDS_IMAGES = "TYPE_TOP_TRENDS_IMAGES";
public static void logEvent(String eventId, String attributeName, String name) {
Answers.getInstance().logCustom(new CustomEvent(eventId).putCustomAttribute(attributeName, name));
}
logEvent(EVENT_OPEN_TOP_TRENDS, TOP_TRENDS_TYPE, TYPE_TOP_TRENDS_IMAGES);
稍后,您可以在Fabric网站上查看您的应用安装程序的来源。
答案 1 :(得分:0)
使用此日志检查您将使用的所有应用程序显示哪些结果检测安装程序包名称:
final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages) {
String is = pm.getInstallerPackageName(packageInfo.packageName);//getPackageName());
Log.d(TAG, (packageInfo.packageName==null?"":packageInfo.packageName) + " : " + (is==null?"":is));
}
您将看到已安装的应用的完整列表&amp;包源,或以您想要的方式记录此数据。 的修改 @病毒,我只是想给你一个简单的想法。如果您想了解软件包安装程序名称,可以在启动应用程序时获取此数据,并使用简单的http GET请求将其发送到您自己的服务器,以便检测安装程序名称。用这个简单的抓取器重新发布你的apo。我认为这是一个解决方案。