检测是否从Android电子市场下载了应用程序

我有一个Android库将数据上传到testing服务器和生产服务器。 我希望使用此库的开发人员在开发时使用testing服务器,以及在从Android Market下载应用程序时使用生产服务器。

这是可能的应用程序来告诉它来自哪里(市场或非市场?)我会想象一个人可以检测到签署的JAR文件的存在。

是的,你可以使用签名。 如果在开发过程中使用debugging密钥对应用程序进行签名,并在将应用程序上传到市场时使用释放密钥,则可以检查应用程序签名的签名,并基于该使用testing或生产服务器。 这里是一个小的代码片段来读取您的应用程序的签名:

try { PackageManager manager = context.getPackageManager(); PackageInfo appInfo = manager.getPackageInfo( YOUR_PACKAGE_NAME, PackageManager.GET_SIGNATURES); // Now test if the first signature equals your debug key. boolean shouldUseTestServer = appInfo.signatures[0].toCharsString().equals(YOUR_DEBUG_KEY); } catch (NameNotFoundException e) { // Expected exception that occurs if the package is not present. } 

YOUR_PACKAGE_NAME必须是“com.wsl.CardioTrainer”。 它必须是您在AndroidManifest.xml中使用的软件包名称。 祝你好运

标记

从API 5开始,您可以使用PackageManager.getInstallerPackageName(String) 。 从文档:

检索安装软件包的应用程序的软件包名称。 这确定了包裹来自哪个市场。

要获得Android电子市场的软件包, 这个post可能会有所帮助。

据我所知,市场应用程序没有什么能够“标记”一个应用程序,说它是从市场上下载的。

我看到另一个Android库以不同的方式接近了这个问题。 AdMob Android SDK可以免费下载和使用维基中描述的内容 。 这个库提供广告,所以他们有相同的愿望,能够确定当前正在运行的应用程序正在由开发人员进行testing,还是正在“野外”使用。 他们的方法是要求开发人员在XML中设置“testing”属性或调用他们的库“setTesting(boolean)”函数让图书馆知道要投放哪些广告。 这显然是更多的手动方法,依赖开发人员在发布之前更改一行代码或XML。

您可以将configuration默认为生产环境,并使用将configuration设置为testing环境的自定义Instrumentation 。 在发布到android市场之前,应该删除工具。

也许你可以添加一个设置到你的应用程序的“开发人员模式”。

另一种可能性是,在SD卡上寻找一个特殊的文件或configuration文件,然后closures它。