是否有可能检测到Android应用程序是测试版还是生产版?

时间:2014-07-18 07:32:28

标签: android google-play

我们在Google Play商店中使用测试阶段。对于应用程序端强制更新功能,我们希望检测我们的应用程序是来自测试阶段还是来自Google Play商店的生产阶段。这在Android应用程序中是否可行?

6 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

当前无法检测是从Play商店的Beta还是Production Track安装了该应用。

假设您的应用将连接到您拥有的API-您可以做的是让API确定该应用是Beta版还是Prod应用。例如,将被视为Prod应用程序的应用程序版本号存储在API上,当该应用程序连接到API时,它将其版本号传递给API,并且API返回是否为Prod的响应(该版本与

或Beta应用程序(与已存储的应用程序不匹配)。

对此有2个限制

  1. 您需要在API上更新移动应用的版本号 当应用准备好投入生产时。
  2. 移动应用将由其版本号而不是版本号决定 跟踪他们在Play商店中的状态。

如果您对这2个限制感到满意,那么您将只有1个APK,并且可以确定您的应用是Prod还是Beta。

答案 2 :(得分:1)

就像@Jayen 所说的,可以使用 Google AndroidPublisher Service API。请参阅以下示例代码(在 Java 中):

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.SecurityUtils;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisherScopes;
import com.google.api.services.androidpublisher.model.AppEdit;

import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.util.Objects;
import java.util.Set;

public class AndroidPublisherService {

    private final AndroidPublisher service;

    /**
     * Constructs a GooglePlayService instance with the specified credentials.
     *
     * @param accountId
     * @param keyStoreInputStream
     * @param keyStorePassword
     * @param keyAlias
     * @param keyPassword
     * @throws GeneralSecurityException
     * @throws IOException
     */
    public AndroidPublisherService(
            String accountId,
            InputStream keyStoreInputStream,
            String keyStorePassword,
            String keyAlias,
            String keyPassword
    ) throws GeneralSecurityException, IOException {
        // Specify info for your application 'CompanyName-ApplicationName/ApplicationVersion'
        // This is not part of the authentication, but sample code from Google specifies this.
        final String applicationName = "SomeCompany-SomeApplication/1.0";
        final JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        final HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        final var keyInputStream = Objects.requireNonNull(keyStoreInputStream);
        final var key = Objects.requireNonNull(SecurityUtils.loadPrivateKeyFromKeyStore(
                SecurityUtils.getPkcs12KeyStore(),
                keyInputStream,
                keyStorePassword,
                keyAlias,
                keyPassword
        ));
        var credentials = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(accountId)
                .setServiceAccountScopes(Set.of(AndroidPublisherScopes.ANDROIDPUBLISHER))
                .setServiceAccountPrivateKey(key)
                .build();
        this.service = new AndroidPublisher.Builder(
                httpTransport, jsonFactory, credentials
        ).setApplicationName(applicationName).build();
    }

    /**
     * Checks whether the application with the specified packageName/versionCode is in the production lane or not.
     *
     * @param packageName The package name of the application
     * @param versionCode The version code of the application
     * @return true if the application is a test version (not in production lane), false otherwise.
     * @throws IOException
     */
    public boolean isTestVersion(String packageName, long versionCode) throws IOException {
        // Create the API service.
        final AndroidPublisher.Edits edits = service.edits();

        // Create a new edit to make changes.
        AndroidPublisher.Edits.Insert editRequest = edits
                .insert(packageName, null);
        AppEdit appEdit = editRequest.execute();

        // Get a list of apks.
        var tracksListResponse = edits
                .tracks()
                .list(packageName, appEdit.getId()).execute();
        return tracksListResponse.getTracks().stream()
                .filter(it -> !it.getTrack().equalsIgnoreCase("production"))
                .flatMap(it -> it.getReleases().stream())
                .anyMatch(it -> it.getVersionCodes().contains(versionCode));
    }
}

答案 3 :(得分:0)

在您的应用版本名称中使用“ beta”或“ staging”,您可以使用ffa_tmp来获取它,并使用Regex或getPackageInfo()

检查
indexOf

答案 4 :(得分:-1)

假设通常将相同的APK从Beta升级为正式版,Dizzy的回答表明,必须调用某些外部API才行。

但是,您可以使用Android HttpURLConnnection来查看Google Play商店详细信息页面中自己的应用ID,而不是设置并使用自己的后端API。

如果当前用户已注册Beta,则应用名称显示为“ 应用名称(测试版)”。

在页面的更下方,还会显示“ 您是此应用的Beta测试人员。太棒了!

页面包含一个标记为“安装”,“更新”或“已安装”的按钮,您可以从中确定用户是否具有最新版本

在同一页面上,您的应用程序还可以查找上次生产的更新日期和最新生产的版本名称。

示例Java代码,以了解您如何在下面实现该代码:

boolean isBeta = false;
URL url = new URL("https://play.google.com/sore/apps/details?id=com.example.app");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
  InputStream in = new BufferedInputStream(urlConnection.getInputStream());
  Scanner scanner = new Scanner(in);
  isBeta = (scanner.findWithinHorizon("\\s\\(Beta\\)", 650000) != null);
} finally {
  urlConnection.disconnect();
}

答案 5 :(得分:-2)

您可以在资源中添加一个字符串,名为' VERSION' ,并给它适当的价值。 从您的应用程序,您可以检查该ID并执行所需的任何操作