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

时间:2009-06-12 13:25:10

标签: android

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

应用程序是否可以告诉它来自哪里(市场或非市场?)我想可以检测到已签名的JAR文件的存在。

5 个答案:

答案 0 :(得分:37)

是的,你可以使用签名。如果您在开发期间使用调试密钥签署应用程序,并在将应用程序上传到市场时使用发布密钥,则可以检查应用程序签名的签名,并基于该使用测试或生产服务器。 这是一个用于阅读应用签名的小代码:

    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中使用的包名称。 祝你好运

标记

答案 1 :(得分:10)

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

  

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

要获取Android电子市场的套餐,this post可能有帮助。

答案 2 :(得分:3)

据我所知,市场应用程序没有做任何事情来“标记”一个应用程序,说它是从市场上下载的。

我已经看到另一个Android库以不同方式处理此问题。 AdMob Android SDK可以免费下载和使用,如on their wiki所述。这个库提供广告,因此他们有同样的愿望,能够确定当前正在运行的应用程序是否正在由开发人员进行测试,或者是否“在野外”使用它。他们的方法是要求开发人员在XML中设置“测试”属性或调用他们的库“setTesting(boolean)”函数,让库知道要提供哪些广告。这显然更像是一种手动方法,它依赖于开发人员在发布之前更改一行代码或XML。

答案 3 :(得分:1)

您可以将配置默认为生产环境,并使用自定义Instrumentation将配置设置为测试环境。在发布到Android市场之前应该删除Intrumentation。

答案 4 :(得分:0)

也许您可以为“开发者模式”为您的应用添加设置。

另一种可能性,让它在SD卡上寻找一个特殊的文件或配置文件,并关闭它。