GMS问题 底部边缘无法唤起谷歌助手

1.从settings查看哪里控制谷歌助手打开关闭

分析控制器是通过属性值来打开和关闭谷歌助手底部边缘手势,Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED

public class GestureNavigationSettingsAssistController extends TogglePreferenceController {

    public GestureNavigationSettingsAssistController(Context context, String key) {

        super(context, key);

    }

    @Override

    public boolean isChecked() {

        boolean onByDefault = mContext.getResources().getBoolean(

                com.android.internal.R.bool.config_assistTouchGestureEnabledDefault);

        return Settings.Secure.getInt(mContext.getContentResolver(),

                Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED, onByDefault ? 1 : 0)

                == 1;

    }

    @Override

    public boolean setChecked(boolean isChecked) {

        return Settings.Secure.putInt(mContext.getContentResolver(),

                Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED, isChecked ? 1 : 0);

    }

    @Override

    public int getAvailabilityStatus() {

        return SystemNavigationPreferenceController.isGestureAvailable(mContext) ? AVAILABLE

                : UNSUPPORTED_ON_DEVICE;

    }

    @Override

    public int getSliceHighlightMenuRes() {

        return R.string.menu_key_system;

    }

}

发现SystemUI的NavBarHelper.java中有使用这个值

######################1#####################

  public void init() {

        mContentResolver.registerContentObserver(

                Settings.Secure.getUriFor(Settings.Secure.ASSISTANT),

                false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL);

        mContentResolver.registerContentObserver(

                Settings.Secure.getUriFor(Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED),

                false, mAssistContentObserver, UserHandle.USER_ALL);

        mContentResolver.registerContentObserver(

                Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),

                false, mAssistContentObserver, UserHandle.USER_ALL);

        updateAssistantAvailability();

        updateA11yState();

    }

######################2#####################

private void updateAssistantAvailability() {

        boolean assistantAvailableForUser = mAssistManagerLazy.get()

                .getAssistInfoForUser(UserHandle.USER_CURRENT) != null;

        boolean longPressDefault = mContext.getResources().getBoolean(

                com.android.internal.R.bool.config_assistLongPressHomeEnabledDefault);

        mLongPressHomeEnabled = Settings.Secure.getIntForUser(mContentResolver,

                Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED, longPressDefault ? 1 : 0,

                mUserTracker.getUserId()) != 0;

        boolean gestureDefault = mContext.getResources().getBoolean(

                com.android.internal.R.bool.config_assistTouchGestureEnabledDefault);

        mAssistantTouchGestureEnabled = Settings.Secure.getIntForUser(mContentResolver,

                Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED, gestureDefault ? 1 : 0,

                mUserTracker.getUserId()) != 0;

        mAssistantAvailable = assistantAvailableForUser

                && mAssistantTouchGestureEnabled

                && QuickStepContract.isGesturalMode(mNavBarMode);

        dispatchAssistantEventUpdate(mAssistantAvailable);

    }

先看回调方法最终调用updateAssistantAvailability()

    private void dispatchAssistantEventUpdate(boolean assistantAvailable) {

        for (NavbarTaskbarStateUpdater listener : mA11yEventListeners) {

            listener.updateAssistantAvailable(assistantAvailable);

        }

    }

其中NavbarTaskbarStateUpdater是一个接口,此处为实现了接口功能的实现类都会回调。

A实现走

private void updateAssistantEntrypoints(boolean assistantAvailable) {

        if (mOverviewProxyService.getProxy() != null) {

            try {

                mOverviewProxyService.getProxy().onAssistantAvailable(assistantAvailable);

            } catch (RemoteException e) {

                Log.w(TAG, "Unable to send assistant availability data to launcher");

            }

        }

        reconfigureHomeLongClick();

    }

B实现走

private void updateAssistantAvailability(boolean assistantAvailable) {

        if (mOverviewProxyService.getProxy() == null) {

            return;

        }

        try {

            mOverviewProxyService.getProxy().onAssistantAvailable(assistantAvailable);

        } catch (RemoteException e) {

            Log.e(TAG, "onAssistantAvailable() failed, available: " + assistantAvailable, e);

        }

    }

最终调用mOverviewProxyService.getProxy().onAssistantAvailable(assistantAvailable);方法去实现

通过aidl通信去launcher3中实现。

通过这里来判断是否触发谷歌助手

public boolean canTriggerAssistantAction(MotionEvent ev) {

        return mAssistantAvailable

                && !QuickStepContract.isAssistantGestureDisabled(mSystemUiStateFlags)

                && mRotationTouchHelper.touchInAssistantRegion(ev)

                && !isLockToAppActive();

    }

添加log后发现是mRotationTouchHelper.touchInAssistantRegion(ev)这个方法一直为false,所以无法唤起Google助手

具体实现方法为OrientationTouchTransformer.java中

boolean touchInAssistantRegion(MotionEvent ev) {

        return mAssistantLeftRegion.contains(ev.getX(), (ev.getY() -(float)0.01))

                || mAssistantRightRegion.contains(ev.getX(), (ev.getY() - (float)0.01));

    }

最终加入log后发现,每次ev.getY()恰好和mAssistantLeftRegion或mAssistantRightRegion的Y相等,所以判断不在范围内

解决如下:

boolean touchInAssistantRegion(MotionEvent ev) {

        return mAssistantLeftRegion.contains(ev.getX(), (ev.getY() -(float)0.01))

                || mAssistantRightRegion.contains(ev.getX(), (ev.getY() - (float)0.01));

    }

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值