分析:新建短信,当我们接受人RecipientsEditor中输入+86的时候,系统会自动在+86后加入空格

我们可以认为这是一个很人性的格式化操作,在ComposeMessageActivity中系统在调用initRecipientsEditor()方法对联系人进行初始化的时候调用了 PhoneNumberFormatter.setPhoneNumberFormattingTextWatcher(this, mRecipientsEditor);我们通过对代码进行追踪发现,最终调用了Framework中PhoneNumberFormattingTextWatcher类对电话号码进行格式化处理,并在处理后在PhoneNumberFormatter中使用异步类控件的值进行处理,这里贴处该类的代码进行分析。

package android.telephony;

import com.android.i18n.phonenumbers.AsYouTypeFormatter;

import com.android.i18n.phonenumbers.PhoneNumberUtil;

import android.telephony.PhoneNumberUtils;

import android.text.Editable;

import android.text.Selection;

import android.text.TextWatcher;

import java.util.Locale;

/**

* Watches a {@link android.widget.TextView} and if a phone number is entered

* will format it.

* <p>

* Stop formatting when the user

* <ul>

* <li>Inputs non-dialable characters</li>

* <li>Removes the separator in the middle of string.</li>

* </ul>

* <p>

* The formatting will be restarted once the text is cleared.

*/

public class PhoneNumberFormattingTextWatcher implements TextWatcher {

/**

* Indicates the change was caused by ourselves.

*/

private boolean mSelfChange = false;

/**

* Indicates the formatting has been stopped.

*/

private boolean mStopFormatting;

private AsYouTypeFormatter mFormatter;

/**

* The formatting is based on the current system locale and future locale changes

* may not take effect on this instance.

*/

public PhoneNumberFormattingTextWatcher() {

this(Locale.getDefault().getCountry());

}

/**

* The formatting is based on the given <code>countryCode</code>.

*

* @param countryCode the ISO 3166-1 two-letter country code that indicates the country/region

* where the phone number is being entered.

*

* @hide

*/

public PhoneNumberFormattingTextWatcher(String countryCode) {

if (countryCode == null) throw new IllegalArgumentException();

mFormatter = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(countryCode);

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count,

int after) {

if (mSelfChange || mStopFormatting) {

return;

}

// If the user manually deleted any non-dialable characters, stop formatting

if (count > 0 && hasSeparator(s, start, count)) {

stopFormatting();

}

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

if (mSelfChange || mStopFormatting) {

return;

}

// If the user inserted any non-dialable characters, stop formatting

if (count > 0 && hasSeparator(s, start, count)) {

stopFormatting();

}

}

@Override

public synchronized void afterTextChanged(Editable s) {

if (mStopFormatting) {

// Restart the formatting when all texts were clear.

mStopFormatting = !(s.length() == 0);

return;

}

if (mSelfChange) {

// Ignore the change caused by s.replace().

return;

}

String formatted = reformat(s, Selection.getSelectionEnd(s));

if (formatted != null) {

int rememberedPos = mFormatter.getRememberedPosition();

mSelfChange = true;

s.replace(0, s.length(), formatted, 0, formatted.length());

// The text could be changed by other TextWatcher after we changed it. If we found the

// text is not the one we were expecting, just give up calling setSelection().

if (formatted.equals(s.toString())) {

Selection.setSelection(s, rememberedPos);

}

mSelfChange = false;

}

}

/**

* Generate the formatted number by ignoring all non-dialable chars and stick the cursor to the

* nearest dialable char to the left. For instance, if the number is  (650) 123-45678 and ‘4‘ is

* removed then the cursor should be behind ‘3‘ instead of ‘-‘.

*/

private String reformat(CharSequence s, int cursor) {

// The index of char to the leftward of the cursor.

int curIndex = cursor - 1;

String formatted = null;

mFormatter.clear();

char lastNonSeparator = 0;

boolean hasCursor = false;

int len = s.length();

for (int i = 0; i < len; i++) {

char c = s.charAt(i);

if (PhoneNumberUtils.isNonSeparator(c)) {

if (lastNonSeparator != 0) {

formatted = getFormattedNumber(lastNonSeparator, hasCursor);

hasCursor = false;

}

lastNonSeparator = c;

}

if (i == curIndex) {

hasCursor = true;

}

}

if (lastNonSeparator != 0) {

formatted = getFormattedNumber(lastNonSeparator, hasCursor);

}

return formatted;

}

private String getFormattedNumber(char lastNonSeparator, boolean hasCursor) {

return hasCursor ? mFormatter.inputDigitAndRememberPosition(lastNonSeparator)

: mFormatter.inputDigit(lastNonSeparator);

}

private void stopFormatting() {

mStopFormatting = true;

mFormatter.clear();

}

private boolean hasSeparator(final CharSequence s, final int start, final int count) {

for (int i = start; i < start + count; i++) {

char c = s.charAt(i);

if (!PhoneNumberUtils.isNonSeparator(c)) {

return true;

}

}

return false;

}

}

通过查看PhoneNumberFormattingTextWatcher代码我们发现,该类继承至TextWatcher,则实现了对RecipientEditor的值的变化进行了监听,最后调用PhoneNumberUtils进行处理。

分析:新建短信,当我们接受人RecipientsEditor中输入+86的时候,系统会自动在+86后加入空格,布布扣,bubuko.com

时间: 2024-12-28 12:39:09

分析:新建短信,当我们接受人RecipientsEditor中输入+86的时候,系统会自动在+86后加入空格的相关文章

解决新建短信时,输入“+86”,然后输入联系人名字“1”,按删除键之后,联系人变为“1”,删除操作为达到预期结果

1.保存一个"+8618621058121"号码的联系人"Jane" 2.保存一个号码是"42266888"的联系人"1" 3.信息-新建信息-在联系人输入框中输入"+86"-输入"1"-点击删除按钮 [测试结果]联系人变为1 [预期结果]联系人应为"Jane" 与问题相关的类为Mms下的ComposeMessageActivity,相关控件为在initRecipie

金笛短信设备在防汛指挥系统中的应用

山洪灾害是指山丘区由于降雨引发的山洪和由山洪引发的泥石流.滑坡等对人民生命和财产造成损失的自然灾害.据统计,我国每年因山洪灾害对国家和人民生命财产造成的损失约占自然灾害造成的总损失的40%左右. 山洪灾害不仅对山丘区的基础设施造成毁灭性破坏,而且对人民群众的生命及财产安全构成极大的威胁,制约山丘区经济社会可持续发展,已成为当前防灾减灾中的突出问题.在国家防汛抗旱总指挥部办公室的规划指导下,为了有效地防御山洪灾害,保证抗洪抢险救灾工作高效有序进行,最大限度地减少人员伤亡以及财产损失,保证社会全面.

将安卓手机短信导入到iPhone6 plus中

不越狱的情况下短信不能直接同步到iphone手机,视频.图片.联系人可以直接使用itools的手机搬家功能超方便从android到iphone中.短信得变通的处理才能导入. 工具: 安卓手机iPhone手机电脑itools软件 方法/步骤 使用itools将安卓手机的短信导出,为XXX.CSV格式的文件.   使用itunes创建一个本地的备份,使用itools打开itunes备份管理   双击进入短信,双击打开sms.db文件 4 选择导入csv文件,将上面导出的文件,导入到itunes备份管

android 在新建短信时,加入名称为&quot;,&quot;(英文逗号)的联系人时,应用崩溃

请修改文件 /alps/frameworks/ex/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java private static Cursor queryAddressData(Context context, ArrayList<String> addressesList,  int addressType) 把这里: /// M: Support recognizing two kinds of separato

如何进行手机短信恢复

如何进行手机短信恢复?短信在我们每个人的手机中都会有存放,甚至会积累很多,因为经常会收到广告短信:快递取件码短信:软件验证码短信等.我们平时也是懒得去删除,如果有一天需要清理了一不小心误删了重要的短信该怎么找回呢?小编这里教给大家一个实用可靠的恢复工具.第一步:首先我们可以在应用商城或者浏览器中搜索"极速数据恢复"这款恢复工具,安装即可.第二步:打开安装好的恢复工具,我们会在首页看到几大恢复功能选项,选择我们需要"短信恢复"选择就可以了.第三步:系统会自动对选择的恢

Android 智能短信第一天(下午)

ConversationFragment的布局: 首先我们找到我们要写的Fragment布局文件. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:

基于j2ee的信箱与短信系统设计与实现

摘    要 当前,信箱与短信系统己经成为对外信息公开.受理公众投诉.咨询和政民互动的主要渠道之一.传统的信箱与短信系统受理时间长.效率低.渠道单一,同时受人为影响较大,督促较为困难. 随着科学技术的发展,计算机网络技术在行业应用的普及,应用现代信息技术在市长信箱与短信系统展现出了越来越多的优势.木文基于贵州某市的实际需求,完成了市长信箱与短信系统的分析和设计. 本文完成了一个基于B/S架构.以J2EE技术和SQLServer后台数据库为基础的.具备多渠道受理.后台统一管理.标准化.流程化.大量

Android手机使用广播监听手机收到的短信

我们使用的Android手机在收到短信的时候会发出一条系统广播.该条广播中存放着接收到的短信的详细信息.本文将详细介绍如何通过动态注册广播来监听短信. 注册广播有两种方式,一种是动态注册,另一种是静态注册.动态注册,顾名思义就是在程序运行时注册的,需要用到广播的时候就注册,用完即销毁.静态注是在AndroidManifest.xml中注册的,在<application>中使用<receiver>标签注册. 那么如何创建一个监听短信的广播接收器呢,其实只需要新建一个类,让这个类继承B

调用系统的打电话,发短信,邮件,蓝牙

在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的系统应用.常用的协议如下: 打电话:tel:或者tel://.telprompt:或telprompt://(拨打电话前有提示) 发短信:sms:或者sms:// 发送邮件:mailto:或者mailto:// 启动浏览器:http:或者http:// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16