Подтвердить что ты не робот

Обнаруживать, если установлена ​​новая версия или обновленная версия (приложение для Android)

У меня есть приложение в Play Маркете. Я хочу сказать, что если пользователи хотят использовать определенную часть приложения, они должны пригласить друга, прежде чем смогут это сделать. Но я только хочу наложить это ограничение на новые установки приложения (честно говоря, для пользователей, которые установили приложение до ограничения). Извините за длинное введение, мой вопрос в том, как узнать, обновлено ли текущее устройство или какая новая установка?

4b9b3361

Ответ 1

Проверьте, сохраняет ли старая версия вашего приложения некоторые данные на диске или предпочтениях. Эти данные должны быть безопасными, то есть они не могут быть удалены пользователем (я не уверен, что это возможно).

Когда новая версия будет установлена ​​недавно, эти данные не будут существовать. Если новая версия является обновлением от старой версии, эти данные будут существовать.

В худшем случае старый пользователь будет помечен как новый и будет иметь ограниченное использование.

Ответ 2

public static boolean isFirstInstall() {
    try {
        long firstInstallTime =   App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).firstInstallTime;
        long lastUpdateTime = App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).lastUpdateTime;
        return firstInstallTime == lastUpdateTime;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return true;
    }
}



public static boolean isInstallFromUpdate() {
    try {
        long firstInstallTime =   App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).firstInstallTime;
        long lastUpdateTime = App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).lastUpdateTime;
        return firstInstallTime != lastUpdateTime;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}

Ответ 3

Единственное решение, которое я вижу, не связанное с сущностью вне устройства, - это получить PackageInfo для вашего приложения и проверить значения

При первой установке firstInstallTime и lastUpdateTime будут иметь одинаковое значение (по крайней мере, на моем устройстве они были одинаковыми); после обновления значения будут отличаться, потому что lastUpdateTime изменится. Кроме того, вы знаете приблизительно, какую дату и время вы создаете версию, которая вводит это новое поведение, и вы также знаете, какой код версии он будет иметь.

Я бы расширил Application и выполнил эту проверку в onCreate() и сохранил результат в SharedPreferences:

public class MyApplication extends Application {

    // take the date and convert it to a timestamp. this is just an example.
    private static final long MIN_FIRST_INSTALL_TIME = 1413267061000L;
    // shared preferences key
    private static final String PREF_SHARE_REQUIRED = "pref_share_required";

    @Override
    public void onCreate() {
        super.onCreate();
        checkAndSaveInstallInfo();
    }

    private void checkAndSaveInstallInfo() {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        if (prefs.contains(PREF_SHARE_REQUIRED)) {
            // already have this info, so do nothing
            return;
        }

        PackageInfo info = null;
        try {
            info = getPackageManager().getPackageInfo(getPackageName(), 0);
        } catch (NameNotFoundException e) {
            // bad times
            Log.e("MyApplication", "couldn't get package info!");
        }

        if (packageInfo == null) {
            // can't do anything
            return;
        }

        boolean shareRequired = true;
        if (MIN_FIRST_INSTALL_TIME > info.firstInstallTime
                && info.firstInstallTime != info.lastUpdateTime) {
            /*
             * install occurred before a version with this behavior was released
             * and there was an update, so assume it a legacy user
             */
            shareRequired = false;
        }
        prefs.edit().putBoolean(PREF_SHARE_REQUIRED, shareRequired).apply();
    }
}

Это не безупречно, есть способы обойти это, если пользователь действительно хочет, но я думаю, что это примерно так же хорошо, как и получается. Если вы хотите лучше отслеживать эти вещи и избегать вмешательства пользователя, вы должны начать хранить информацию о пользователе на сервере (при условии, что у вас есть какой-либо бэкэнд).

Ответ 4

Обновить

(спасибо за комментарии ниже моего ответа для подталкивания к более конкретному/полному ответу).

Поскольку вы не можете задним числом изменить код для предыдущих версий своего приложения, я думаю, что самое простое - разрешить установку всех текущих установок.

Таким образом, чтобы отслеживать это, одним из способов было бы найти часть информации, которая указывает на конкретную версию вашего приложения. Будь то файл с меткой времени, или SharedPreferences, или даже versionCode (как предложено @DaudArfin в его ответе) из последней версии приложения, которое вы хотите разрешить пользователям не иметь этого ограничения. Тогда вам нужно изменить это. Это изменение станет вашей отправной точкой для всех предыдущих установок. Для этих пользователей отметьте их флаг "has_shared" как true. Они становятся дедушками. Затем, двигаясь вперед, вы можете установить значение по умолчанию для "has_shared" в true

(Оригинал, частичный ответ ниже)

Используйте SharedPrefence (или аналогичный)

Используйте что-то вроде SharedPreferences. Таким образом, вы можете has_shared = true простое значение, такое как has_shared = true и SharedPreferences будет сохраняться через обновления приложения.

Примерно так, когда кто-то подписал/поделился вашим приложением

SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("has_shared", true)
editor.commit();

Тогда вы можете глючить только когда преф возвращает true

SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE);
boolean defaultValue = false;
boolean hasShared= prefs.gettBoolean("has_shared", defaultValue);
if (!hasShared) {
    askUserToShare();
}

Документы для SharedPreference:
http://developer.android.com/training/basics/data-storage/shared-preferences.html

Ответ 5

Мое решение - использование SahredPreference

private int getFirstTimeRun() {
    SharedPreferences sp = getSharedPreferences("MYAPP", 0);
    int result, currentVersionCode = BuildConfig.VERSION_CODE;
    int lastVersionCode = sp.getInt("FIRSTTIMERUN", -1);
    if (lastVersionCode == -1) result = 0; else
        result = (lastVersionCode == currentVersionCode) ? 1 : 2;
    sp.edit().putInt("FIRSTTIMERUN", currentVersionCode).apply();
    return result;
}

return 3 posibles values:

  • 0: APP - первая установка
  • 1: APP запускается один раз
  • 2: APP обновлен

Ответ 6

Вы можете получить код версии и имя версии, используя ниже фрагмент кода

String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;

Теперь вы можете проверить последнюю версию и ограничить свои требования.

Ответ 7

Мы можем использовать широковещательный приемник для прослушивания обновлений приложения.

приемник

class AppUpgradeReceiver : BroadcastReceiver() {

  @SuppressLint("UnsafeProtectedBroadcastReceiver")
  override fun onReceive(context: Context?, intent: Intent?) {
    if (context == null) {
        return
    }
    Toast.makeText(context, "Updated to version #${BuildConfig.VERSION_CODE}!", Toast.LENGTH_LONG).show()
  }

}

Manifest

<receiver android:name=".AppUpgradeReceiver">
<intent-filter>
    <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>

Это не работает во время отладки. Таким образом, вы должны установить вручную.

  1. Увеличьте versionCode в уровне приложения build.gradle (чтобы он считался обновлением).
  2. Нажмите "Построить" → "Построить набор (ы)/APK (s)"> "Построить APK (и)" и выберите отладочный APK.
  3. Выполните следующую команду в терминале Android Studio:

    adb install -r C:\Repositories\updatelistener\app\build\outputs\apk\debug\app-debug.apk