Убедитесь, что приложение Android установлено из Play-Store

Недавно я обнаружил приложение BlackMarket, это приложение из Google Play-Store, в котором эти люди берут платное приложение из Play-Store и позволяют своим пользователям загружать его и использовать его бесплатно.

Как разработчик, который планирует взимать плату за мое приложение, это беспокоит меня, и я хотел бы убедиться, что мое приложение было установлено через Play-Store или в любом магазине, который я одобряю.

Я предполагаю, что единственный способ проверить такие вещи - отслеживать кампании, но поскольку Google analytics v2 отслеживает кампанию в приемнике в Jar.

Есть ли другой способ определить происхождение установки моего приложения? Есть ли способ перехватить данные отслеживания кампании?

Спасибо.

Ответ 1

Проверьте эту ссылку здесь. Тогда

PackageManager pm = getPackageManager();
String installationSource = pm.getInstallerPackageName(getPackageName());

При установке из отмеченного, installationSource вернет что-то вроде com.google.android% или com.android.vending%. Однако это изменяется, и вы должны поддерживать (поддерживать) его в случае изменения - иначе он вернет null (от отладчика) или какое-либо другое имя пакета из другого приложения (нежелательные:))

Ответ 2

Лучший способ узнать, есть ли приложение из Play Маркета, - это то, что предложили g00dy: используя имя пакета установщика.

String packageName = appContext.getPackageName();
String installerPackage = appContext.getPackageManager().getInstallerPackageName(packageName);

если приложение загружено в Play Store (даже если приложение куплено с ПК), installerPackage должен быть "com.vending.google".

Ответ 3

Я нашел это http://developer.android.com/google/play/licensing/licensing-reference.html#lvl-summary

public boolean allowAccess() {
    long ts = System.currentTimeMillis();
    if (mLastResponse == LicenseResponse.LICENSED) {
        // Check if the LICENSED response occurred within the validity timeout.
        if (ts <= mValidityTimestamp) {
            // Cached LICENSED response is still valid.
            return true;
        }
    } else if (mLastResponse == LicenseResponse.RETRY &&
                ts < mLastResponseTime + MILLIS_PER_MINUTE) {
        // Only allow access if we are within the retry period or we haven't used up our
        // max retries.
        return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
    }
    return false;
}