谷歌输入法设置隐藏

由于我们产品没有Android底部三个导航键,并且开机之后就启动我们自己的app,一旦进入输入法设置之后就无法退出当前界面。只能重新启动机器,这是一个很操蛋的bug,
就是这个设置
之前有测试的同学告诉我。我上一个版本没有设置这个选项,通过查询log得知,我之前版本是没有做user_setup_complete 初始化设置。
有两种解决办法。
第一中就是直接系统第一次开机的时候不设置

  Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);

这样可能会引起其他问题,因为系统很多源码都会获取

Settings.Secure.USER_SETUP_COMPLETE 是否 =1 

据我所知 framework很多源码都会调用这个属性,如果为0 会引起系统某些未知bug,
第二种方法

 Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE);

我们已知输入法是通过上面的方法获取当前USER_SETUP_COMPLETE 的值,为 1代表已经初始化, 为0 未初始化。
所以可以在 getInt中判断 当前正在调用本方法的app名字。如果是谷歌输入法,就默认返回 0 ,
文件

frameworks/base/core/java/android/provider/Settings.java
 public static final class Secure extends NameValueTable {
        ****
         public static String getStringForUser(ContentResolver resolver, String name,
                int userHandle) {
                //add
			 String Pname = resolver.getPackageName();
			 Log.e(TAG,"user getInt package name is " + Pname);
			 Log.e(TAG,"user getInt name  name is " + name);
			 //add end
             if(name.equals("USER_SETUP_COMPLETE")&&(Pname.equals("com.google.android.inputmethod.pinyin"))){
                 return "0";
             }
            if (MOVED_TO_GLOBAL.contains(name)) {
                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
                        + " to android.provider.Settings.Global.");
                return Global.getStringForUser(resolver, name, userHandle);
            }

            if (MOVED_TO_LOCK_SETTINGS.contains(name)) {
                synchronized (Secure.class) {
                    if (sLockSettings == null) {
                        sLockSettings = ILockSettings.Stub.asInterface(
                                (IBinder) ServiceManager.getService("lock_settings"));
                        sIsSystemProcess = Process.myUid() == Process.SYSTEM_UID;
                    }
                }
                if (sLockSettings != null && !sIsSystemProcess) {
                    // No context; use the ActivityThread's context as an approximation for
                    // determining the target API level.
                    Application application = ActivityThread.currentApplication();

                    boolean isPreMnc = application != null
                            && application.getApplicationInfo() != null
                            && application.getApplicationInfo().targetSdkVersion
                            <= VERSION_CODES.LOLLIPOP_MR1;
                    if (isPreMnc) {
                        try {
                            return sLockSettings.getString(name, "0", userHandle);
                        } catch (RemoteException re) {
                            // Fall through
                        }
                    } else {
                        throw new SecurityException("Settings.Secure." + name
                                + " is deprecated and no longer accessible."
                                + " See API documentation for potential replacements.");
                    }
                }
            }

            return sNameValueCache.getStringForUser(resolver, name, userHandle);
        }
        }
 String Pname = resolver.getPackageName();

是获取调用者的app的包名。

  if(name.equals("USER_SETUP_COMPLETE")&&(Pname.equals("com.google.android.inputmethod.pinyin"))){
                 return "0";
             }

对比要获取的属性名字和调用者的app包名。一致就返回为0,这样既不影响系统稳定。也解决机器设置返回不了问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九霄的爸爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值