在切换输入法时增加Dialog弹窗提醒

这两天改了一个还要折磨死我的bug,各种求助,一度的碰壁,几乎让我开始怀疑了人生和存在的意义……
起因是这样的,公司的手机送到移动四测,移动给出的反馈是这样的

Android输入:未明示读取联系人(设置-语言和输入法-切换输入法时)
——请增加提示

就是这么一个需求,真变态,因为我们是做手机的公司,手机内置的输入法读取通讯录是很正常与安全的事情,可是移动觉得不安全,没办法,干吧。

文件路径是:alps/frameworks/base/services/core/java/com/android/server/InputMethodManagerService.java

(1)先导包

import android.app.Dialog

(2)声明一个全局变量oldIME用来储存原来的输入法

 private String oldIME;

(3)自定义一个dialog,提醒此输入法会读取您的联系人信息,在点击取消的时候会回退到原来的输入法

 /**
     * Read the contacts to remind
     */
    public void readContactDialog() {
        final Context context = mContext;
        final Context settingsContext = new ContextThemeWrapper(context,
                com.android.internal.R.style.Theme_DeviceDefault_Settings);

        DialogInterface.OnClickListener dialoglistener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int i) {
                switch (i) {
                    case Dialog.BUTTON_POSITIVE:
                        dialog.dismiss();
                        break;
                    case Dialog.BUTTON_NEGATIVE:
                        Settings.Secure.putString(settingsContext.getContentResolver(),Settings.Secure.DEFAULT_INPUT_METHOD,oldIME);
                        dialog.dismiss();
                        break;
                }
            }
        };
        AlertDialog.Builder builder = new AlertDialog.Builder(settingsContext);
        builder.setTitle(com.android.internal.R.string.dialog_alert_title);
        builder.setMessage(com.android.internal.R.string.setting_read_contact);
        builder.setPositiveButton(com.android.internal.R.string.yes, dialoglistener);
        builder.setNegativeButton(com.android.internal.R.string.no, dialoglistener);
        AlertDialog alertDialog = builder.create();
        alertDialog.setCanceledOnTouchOutside(true);
        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alertDialog.show();
    }

(4)然后在切换输入法的dialog的adpterlistner调用我们自定义的readContactDialog(),并给oldIME赋值

           final ImeSubtypeListAdapter adapter = new ImeSubtypeListAdapter(dialogContext,
                    com.android.internal.R.layout.input_method_switch_item, imList, checkedItem);
            final OnClickListener choiceListener = new OnClickListener() {
                @Override
                public void onClick(final DialogInterface dialog, final int which) {
                    //add start 在这里给oldIME赋值,并加入调用的方法
                    oldIME = Settings.Secure.getString(settingsContext.getContentResolver(),Settings.Secure.DEFAULT_INPUT_METHOD);
                    readContactDialog();
                    //add  end 加入结束
                    synchronized (mMethodMap) {
                        if (mIms == null || mIms.length <= which || mSubtypeIds == null
                                || mSubtypeIds.length <= which) {
                            return;
                        }
                        final InputMethodInfo im = mIms[which];
                        int subtypeId = mSubtypeIds[which];
                        adapter.mCheckedItem = which;
                        adapter.notifyDataSetChanged();
                        hideInputMethodMenu();

(5)然后要定义我们的字符串,路径是:alps/frameworks/base/core/res/res/values/strings.xml

    <string name="setting_remind">remind</string>
    <string name="setting_read_contact">The input method will read your contact information, please you determine whether to use</string>

(6)语言环境为中文时的string路径:alps/frameworks/base/core/res/res/values-zh-rCN/strings.xml

    <string name="setting_remind">温馨提示</string>
    <string name="setting_read_contact">此输入法可能会读取您的联系人信息,请您确定是否使用</string>

(7)最后,最重要的一点!!!没有此步你的编译会报找不到此字符串的错误,那就是一定要在symbols内加入此变量声明,这是android5.0之后才有的要求。路径是:alps/frameworks/base/core/res/res/values/symbols.xml

 <java-symbol type="string" name="setting_remind" />
 <java-symbol type="string" name="setting_read_contact" />

到这里的更改就全面结束了,虽然并没有起到监听此输入法到底有没有读取联系人,但至少实现在切换联系人时友好的弹窗提醒,并在取消的时候能够回退到原来的输入法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值