Как вручную обновить ядро HMS?

#huawei-mobile-services #huawei-developers

#huawei-мобильные сервисы #huawei-разработчики

Вопрос:

У меня есть приложение в AppGallery, доступное также для старых телефонов Huawei, таких как P8 или P9. Я заметил, что старые телефоны иногда вылетают из-за устаревшего ядра HMS. Я читал, что ядро HMS может обновляться автоматически, но я хочу сделать это сразу после запуска приложения.

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

Есть ли какой-либо пример того, как вручную вызвать проверку версии ядра HMS?

Ответ №1:

Чтобы вручную обновить ядро HMS (APK) на телефоне Huawei, выполните приведенный ниже пример кода, чтобы проверить, является ли номер версии более ранним, чем 5.0.0.300. Если это так, появится экран загрузки ядра HMS в AppGallery.

Кроме того, не забудьте заменить channelId в URI. Определен идентификатор канала, необходимый для идентификации данных канала. channelId — это идентификатор канала уровня 1, то есть канала, с которого приходит пользователь.

 public static void checkUpdate(Context context){
    String version = "5.0.0.300";
    String pkg = "com.huawei.hwid";
    if (version.compareTo(getVersionCode(pkg, context))  > 0) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("hiapplink://com.huawei.appmarket?appId=C10132067amp;channelId=xxxxxamp;referrer=amp;detailType=0"));
        context.startActivity(intent);
    }
}

private static String getVersionCode(String packageName, Context context) {
    PackageManager packageManager = context.getPackageManager();
    try {
        PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
        return packageInfo.versionName;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return "";
    }
}
  

Ответ №2:

Да, это возможно. Вот предлагаемое решение. Все основано на переменной baseVersion . Если это значение выше, чем код вашей версии ядра HMS, вы получите упомянутое диалоговое окно.

 import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.util.Log;

import com.huawei.hms.adapter.AvailableAdapter;
import com.huawei.hms.adapter.internal.AvailableCode;
import com.huawei.hms.api.ConnectionResu<


/**
 * Check for HMS Update
 */
public class HmsUpdateUtil {
    private static final String TAG = "HmsUpdateUtil";

    private static boolean isInitialized = false;

    private static int versionCheckResult = 12;


    /**
     * Check if HMS needs update
     *
     * @param context context
     * @return result,0 Available, 1 not Available
     */
    public static int isHmsAvailable(Context context) {
        if (versionCheckResult == ConnectionResult.SUCCESS ) {
            return ConnectionResult.SUCCESS;
        }
        Log.d(TAG, "isInitialized is:"   isInitialized);

        if (isInitialized) {
            return 1;
        }

        // minimum HMS version, if less than this version, result will not be 0
        int baseVersion = 50000300;

        AvailableAdapter availableAdapter = new AvailableAdapter(baseVersion);
        int result = availableAdapter.isHuaweiMobileServicesAvailable(context);
        Log.i(TAG, "HMS update result is: "   result);
        
        isInitialized = true;
        
        if (result == ConnectionResult.SUCCESS) {
            Log.i(TAG, "HMS is avaiable");
        } else {
            if (availableAdapter.isUserResolvableError(result)) {
                resolution(availableAdapter, context);
            } else {
                Log.e(TAG, "HMS is not avaiable "   AvailableCode.ERROR_NO_ACTIVITY);
            }
        }
        versionCheckResult = resu<
        return resu<
    }

    private static void resolution(AvailableAdapter availableAdapter, Context context) {
        Log.i(TAG, "HMS update start :");
        Activity activity = findActivity(context);
        if (activity == null) {
            Log.e(TAG, "HMS is not available"   AvailableCode.ERROR_NO_ACTIVITY);
            return;
        }

        // this method will be call upgrade dialog box.
        availableAdapter.startResolution(activity, new AvailableAdapter.AvailableCallBack() {
            @Override
            public void onComplete(int result) {
                if (result == AvailableCode.SUCCESS) {
                    versionCheckResult = resu<
                    Log.i(TAG, "HMS update start success");
                } else {
                    Log.e(TAG, "HMS update failed: "   result);
                    isInitialized = false;
                }
            }
        });
    }

    /**
     * Get Activity by Context
     * @param context context
     * @return Activity
     */
    public static Activity findActivity(Context context) {
        Activity activity = null;
        if (context instanceof Activity) {
            return (Activity) context;
        }
        if (context instanceof ContextWrapper) {
            ContextWrapper wrapper = (ContextWrapper) context;
            return findActivity(wrapper.getBaseContext());
        } else {
            return activity;
        }
    }
}