androidの手机Email学习总结

1. 【电子邮件】编辑界面进入设置中点击设置(右上角)抄送/密送地址选项,点击menu键(左下角)仍显示添加抄送/密送地址选项
运行时动态更新菜单项
boolean onPrepareOptionsMenu(Menu menu)·这个方法将已经创建的 Menu 实例作为参数传递,这样的话就可以移除、添加、修改菜单项。
·Android 2.3及其之前的版本,系统在用户每次打开Options Men 时会调用onPrepareOptionsMenu()方法。
·Android 3.0及其之后的版本,当你要更新菜单时你必须调用 invalidateOptionsMenu() 方法,因为菜单是一直打开着的,然后系统会自动调用 onPrepareOptionsMenu() 方法。

当 Activity 创建时,onCreateOptionsMenu()方法会被调用,但是在 Activity 的整个生命周期中,onCreateOptionsMenu()仅仅只被调用一次。

Android 会保持并重用生成的 Menu 实例,直到 Activity 被销毁。如果在 Menu 实例创建之后想再修改菜单,就必须重载 onPrepareOptionsMenu() 方法。


2.【Email】添加Exchange类型账户,接收设置界面点击“选择”,切换语言后,此界面灰显,无法点击
【预置条件】无
【操作步骤】电子邮件--输入账户和密码--手动设置--Exchange--点击客户端证书后的“选择”icon--home返回idle--
                menu--系统设置--语言和输入法--切换语言--长按home--点击进入电子邮件手动设置界面--查看
【实际结果】1.电子邮件手动设置界面灰显,无法点击
                  2.按back键回到上面的一个节目, dialog框居然没有dismiss。
【预期结果】正常点击进入
修改:
1). KeyChain. choosePrivateKeyAlias()此API的設計:
每當呼叫一次, 時就會去start KeyChain Activity一次.
而目前KeyChain是属于Public SDK的, 所以目前也是不建议修改的(如添加Activity Flags)~
CertificateRequestor在onCreate()時就會去觸發第一次KeyChain.choosePrivateKeyAlias()
而在切换语言, back到Email的task的时候, CertificateRequestor就会因为config changes, 而被relaunch~ 过程就会重新调用KeyChain.choosePrivateKeyAlias, 也即会重新调起新的keyChainActivity,与之前已经启动的KeyChainActivity重叠压在Email Task,所以在back的时候,仍然能够看到dialog,实际上也就是两个dialog 存在~
2).   alps/packages/apps/Settings/src/com/android/settings/CredentialStorage.java中增加onCreate()方法:
        protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               sConfigureKeyGuardDialog = null;
               sResetDialog = null;
               sUnlockDialog = null;
       }
     修改原因:
   因为sResetDialog 是一个static的变量,所以如果CredentialStorage被keychainservice叫起来对次,就会出现show 空的activity的现象。
3).
如需要在Email 端workaround, 则参考修改:
Exchange AndroidManifest
<activity
            android:name=".EasCertificateRequestor"
            android:configChanges="fontScale|orientation|screenSize|mnc|locale|layoutDirection">
............
添加value locale|layoutDirection|screenSize, 使之EasCertificateRequestor在系统语言切换的时候,不会重新relaunch~
因为EasCertificateRequestor 不会re-create,所以不会多次调用keychain的choose,因此也不会存在两个keychainActivity

4.邮件列表
1)界面 subject 布局 Conversation_item_view_normal.xml  ,
这个界面的字体大小和颜色在 styles.xml 具体:
    <style name="SubjectAppearanceUnreadStyle">
        <item name="android:textColor">@color/subject_text_color_unread</item>
        <item name="android:textStyle">bold</item>
    </style>
等等
代码subject的坐标在ConversationItemViewCoordinates.java 中函数ConversationItemViewCoordinates
        final int subjectTopAdjust = getLatinTopAdjustment(subject);
        subjectX = getX(subject);
        if (isWide()) {
            subjectY = getY(subject) + subjectTopAdjust;
        } else {
            subjectY = getY(subject) + sendersTopAdjust;
        }
定义的y坐标


2)点击左上角,各收件箱的布局列表2
styles.xml 中
    <style name="FolderListItemStyle">
        <item name="android:layout_marginLeft">@dimen/folder_list_item_start_margin</item>
        <item name="android:layout_marginRight">@dimen/folder_list_item_end_margin</item>
    </style>
布局文件:Folder_item.xml

二部分
1.【电子邮件】电子邮件帐户中无法移除帐户
此问题不是bug,Android 4.4 设置 账户设置中 统一管理,设置中可以删除账户
2.【电子邮件】编辑好一条电子邮件后,关闭网络连接,提示“邮件已另存为草稿”
 
此现象是正常现象,当关闭wifi连接时“更改数据连接”的dialog弹出,编辑mail界面即ComposeActivity进入background,其onPause()会执行,会走到流程onPause()->saveIfNeed()->doSave()->sendOrSaveWithSanityChecks()->sendOrSace(),save为draft后会弹出toast提示,此乃正常流程,请知悉。
3.【电子邮件】未开启网络发送邮件 ,没有无网络提示
1)如何获取网络是否可用?
     /**
    * 检测网络是否可用
    * @return
    */
   public boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo ni = cm.getActiveNetworkInfo();
       return ni != null && ni.isConnectedOrConnecting();
    }
2)发送的时候判断,网络不可用的时候弹出pop
  doSend() 函数:
         // add by heyuming
        if (!isNetworkConnected()) {
            LogUtils.logFeature(LogTag.SENDMAIL_TAG, "Can't send message due to the net can not be used");
            Toast.makeText(this, R.string.need_connection_prompt, Toast.LENGTH_SHORT).show();
            return;
        }
4.邮件发送成功或者失败要求有提示
//lixia when email send successfully,the ui can prompt
  同样修改ComposeActivity.java 函数sendOrSave函数中有定义 SendOrSaveCallBack 类 通过函数SendOrSaveFinished()函数对发送成功或者失败进行了处理
5. 在email应用中,从文件夹中进入Gmail页面,页面提示“内部错误”,不能正常显示页面
这个问题是因为Gmail server服务器的行为导致的。
Gmail server会为每个gmail账户设置一个叫做[Gmail]的特殊folder,这个folder本身是没有信的,只是会有几个自folder,例如[Gmail]/重要 [Gmail]已删除邮件等,对于KK的UI 设计,当选中这个folder时会去跟server对该folder做同步,可是server此时返回 ["NO", ["NONEXISTENT"], "Unknown Mailbox: [Gmail] (now in authenticated state) (Failure)"] 错误,因此,Email客户端会根据这个错误,报出Internal error的信息,这个internal error点击无效是因为这一套UI是专门针对gmail做的(现在Email与gmail共用了一部分),而email对于这一套并没有做实际的实现。
对于这个问题,为了保证email的通用性,我们不会去做修改,如果贵司要修改,可以尝试在
PopImapSyncAdapterService.java的sync()方法的Catch(messagingexception e)一段做如下修改:
--------------------------------------------------------------before-------------------------------------------------------------
} catch (MessagingException e) {
                int cause = e.getExceptionType();
                // XXX It's no good to put the MessagingException.cause here, that's not the
                // same set of values that we use in EmailServiceStatus.
                switch(cause) {
                    case MessagingException.IOERROR:
                        EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, cause, 0,
                                UIProvider.LastSyncResult.CONNECTION_ERROR);
                        syncResult.stats.numIoExceptions++;
                        break;
                    case MessagingException.AUTHENTICATION_FAILED:
                        EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, cause, 0,
                                UIProvider.LastSyncResult.AUTH_ERROR);
                        syncResult.stats.numAuthExceptions++;
                        break;
                    default:
                    EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, cause, 0,
                            UIProvider.LastSyncResult.INTERNAL_ERROR);
                }
            }
         }
--------------------------------------------------------------after-------------------------------------------------------------
catch (MessagingException e) {
                int cause = e.getExceptionType();
                // XXX It's no good to put the MessagingException.cause here, that's not the
                // same set of values that we use in EmailServiceStatus.
                switch(cause) {
                    case MessagingException.IOERROR:
                        EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, cause, 0,
                                UIProvider.LastSyncResult.CONNECTION_ERROR);
                        syncResult.stats.numIoExceptions++;
                        break;
                    case MessagingException.AUTHENTICATION_FAILED:
                        EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, cause, 0,
                                UIProvider.LastSyncResult.AUTH_ERROR);
                        syncResult.stats.numAuthExceptions++;
                        break;
                    default:
                        if ("[Gmail]".equals(mailbox.mServerId)) {
                            EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, EmailServiceStatus.SUCCESS, 0,
                                    UIProvider.LastSyncResult.SUCCESS);
                        } else {
                            EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, cause, 0,
                                    UIProvider.LastSyncResult.INTERNAL_ERROR);
                        }
                }
            }
 
问题6 【Pre-OT1】【CMCC】【电子邮件】电子邮件输入签名,输入超长字符,出现电子邮件无响应
目前签名可以输入的字符太多,目前修改方式,就是把可以输入的字符限制在40个。
根据./hierarchy 工具定位到用的那只文件,根据字符串找到布局文件Account_settings_preferences.xml
一般情况下搜索字符串在email找不到的时候,记得去unifiedemail下找一下,这个签名就在那里面定义的
布局文件修改如下:
    <EditTextPreference
        android:key="account_signature"
        android:title="@string/preferences_signature_title"
        android:inputType="textMultiLine"
        android:minLines="1"
        android:maxLength="130"
        android:dialogTitle="@string/preferences_signature_dialog_title" />
 android:maxLength="130" ---最多可以输入130个字符


7. 【电子邮件】邮件存为草稿、添加附件,正在发送邮件时,相关提示语提示完后,还会继续弹出多余的提示“完成”(HQ00633863 and HQ00633294)


ComposeActivity.java中
sendOrSaveFinished函数里面有如下提示:
       Toast.makeText(ComposeActivity.this, R.string.done, Toast.LENGTH_SHORT)
                         .show();


所以会在很多时候弹出这儿pop。


如果我们只需要在发送邮件成功后弹出完成提示,其他情况不需要这个提示
那么我们就加这个判断 if(!task.mSendOrSaveMessage.mSave)


8. 【CTA】【电子邮件】分别登陆两个帐户后合并视图,收件箱列表界面无法刷新
“合并的视图” 这个如它的名字所示,是个视图,并非真实的folder,所以并非是可以做同步的文件夹,所以不是问题


virtual folder中的任何一个真实folder收到mail后都会自动刷新virtual folder中的内容。
您可以实际验证一下,谢谢。




9【预置条件】电子邮件设置删除前确认,已添加窗口小部件3X3


【操作步骤】IDLE--点击邮件--BACK键返回邮件列表界面--点击一个邮件--点击邮件界面的垃圾桶图标--横屏--确定


【实际结果】提示电子邮件停止运行


【预期结果】应能正常删除


解决方案:


You can follow below to change code 


alps/packages/apps/Email/UnifiedEmail/src/com/android/mail/browse/ConversationCursor.java#setPrimaryItem()


before statement of if (fragment != mCurrentPrimaryItem) {


add:


if (mPendingFragments.get(position) == fragment) {


LogUtils.w(TAG,


"fragment is in pending list, just skip this call to setPrimaryItem, position="


+ position + ", fragment=" + fragment);


return;







10. email相关问题


1)登录exchange协议的邮箱账户,一定要exchange协议的,只有exchange协议支持日历显示,


接收到日程邀请,有一个菜单在日程中显示,则就可以把日程保存在日历中


2)1.exchange账户一般用什么邮箱比较容易设置成功?


2.设置成功,但是一直同步不上邮件,是什么原因?


3.使用163邮箱设置时,还出现过“没有与此服务器同步的权限”的提示,是什么原因? 


答:


1),只要是exchange协议支持的邮箱,而且要此邮箱种类允许exchange协议方式登录,都可以设置成功。


比如:126不支持exchange,gmail目前不允许exchange登录,故登录126/gmail exchange协议的帐号会登录不成功。


而目前163,qq都是可以的,因exchange不同的邮箱要求的地址不一样,所以需要手动输入服务器地址,服务器设置如下:


qq:ex.qq.com


163: i.163.com


其他的邮箱服务器地址需要到相应的网站去查找。


2),因为exchange可以同步日历与联系人,是不是贵司在设置时勾选了同步日程与联系人,而这些数据量比较大,就会出现要同步很久,服务器响应也是需要时间的。




3),Server在ValidateAccount时HTTP 请求会返回403 Forbidden,从而提示“没有与此服务器同步...”


已经有使用各个版本Android手机测试,发现的确一些Android手机可以概率性出现此提示,所以根据目前我们跟踪到的情况就是,极有可能因为这个举动,在Exchange Server侧有一些变动,导致会出现登录Exchange 时exchange端会如此拒绝,与Client端看起来并没有直接关联,并且出现此提示时都是因为Server在HTTP 请求时返回403。目前来看此非客户端问题,所以Client端没有有效办法处理这个事情。 




11. 通过exchange登陆email后,发现邮箱一直处于同步中。




   MTK:看log背景数据同步开关是关闭的,麻烦按照以下步骤开启后再试试:




1. Setting-》Data Usage ->menu 键勾选 Auto-sync data。
2. 将系统时间设置正确。




12 【UI Performance】 第一次新增Email的時間過久, 超過0.8秒 


    贵司想要实现在新建邮件时不弹出IME,从而达到优化launch时间的效果,至于要怎么修改是不太清楚的。


    修改方案:
    在Email的AndroidManifest.xml中找到ComposeActivityEmail的定义部分,在androd:label后面添加一条android:windowSoftInputMode="adjustUnspecified|stateHidden"即可实现新建邮件时不弹出IME的效果。


    贵司也可以参考该link里面的一些方法自行实现 http://mobile.51cto.com/aprogram-403138.htm


    MTK 解析:




    贵司最早提出要优化IME键盘的弹出,MTK提供方案后,贵司又提出分析log看看有没有优化空间,现log分析结果如下:


    经过分析贵司提供的log(第一份log里没有Email相关的log,只有第二份APLog_2014_0102_034323里面有),从Email APP的角度和ActivityManager的角度看,暂时没有发现什么可以优化的地方,这个启动时间已经很短了448ms,和视频里看的差别比较明显,说明有东西干扰了评判标准,从log的角度看这整个activity花的时间很短,而视频里面是包含了IME的初始化以及弹出时间的,让IME不弹出来并不代表IME没有花时间,另外这个是第三方输入法,MTK不能做优化。




    贵司可自行查看提供的log的如下地方:


    1)、点击启动Email App,launch time 为 1s216ms,也就是1216ms。


    Line 31700: 01-02 03:44:02.839 679 699 I ActivityManager: [AppLaunch] Displayed Displayed com.android.email/.activity.Welcome: +1s216ms


    Line 31701: 01-02 03:44:02.840 679 699 D ActivityManager: AP_PROF:AppLaunch_LaunchTime:com.android.email/.activity.Welcome:1216:64530




    2)、点击启动ComposeActivity(新建邮件),从log看来Luanch time 448ms


    Line 32500: 01-02 03:44:10.895 679 987 I ActivityManager: START u0 {cmp=com.android.email/com.android.mail.compose.ComposeActivity (has extras)} from pid 1373




    Line 32836: 01-02 03:44:11.502 679 699 I ActivityManager: [AppLaunch] Displayed Displayed com.android.email/com.android.mail.compose.ComposeActivity: +448ms


    Line 32838: 01-02 03:44:11.502 679 699 D ActivityManager: AP_PROF:AppLaunch_LaunchTime:com.android.email/com.android.mail.compose.ComposeActivity:448:73193




    3)、这个位置看上去花的时间更少249ms。


    Line 35132: 01-02 03:44:29.307 679 699 I ActivityManager: [AppLaunch] Displayed Displayed com.android.email/com.android.mail.compose.ComposeActivity: +249ms


    Line 35133: 01-02 03:44:29.307 679 699 D ActivityManager: AP_PROF:AppLaunch_LaunchTime:com.android.email/com.android.mail.compose.ComposeActivity:249:90998






    相关点完整的log:


    Line 32500: 01-02 03:44:10.895 679 987 I ActivityManager: START u0 {cmp=com.android.email/com.android.mail.compose.ComposeActivity (has extras)} from pid 1373


    Line 32681: 01-02 03:44:11.359 1373 1373 E ComposeActivityEmail: loadAttachmentsInBackground: []


    Line 32682: 01-02 03:44:11.360 1373 1373 D Email : initializing action bar in ComposeActivity


    Line 32836: 01-02 03:44:11.502 679 699 I ActivityManager: [AppLaunch] Displayed Displayed com.android.email/com.android.mail.compose.ComposeActivity: +448ms


    Line 32838: 01-02 03:44:11.502 679 699 D ActivityManager: AP_PROF:AppLaunch_LaunchTime:com.android.email/com.android.mail.compose.ComposeActivity:448:73193




    12  【语信】【l联通】【设置】在应用程序管理结束正在运行的电子邮件程序,出现“很抱歉,Exchange服务已停止运行”。


        此文题原因是ConfirmDialogFragment newInstance()的参数是固定的String而不是资源ID,修改其参数即可解决问题。


        可以按照以下Solution解决此问题:
        1). 修改ConfirmDialogFragment.java
        private static final String RESOURCE_ID = "resource_id";
        private static final String TARGET_SIZE = "terget_size";
        /**
        * Create a new {@link ConfirmDialogFragment}.
        * @param message
        * @return new {@link ConfirmDialogFragment} object.
        */
        // public static ConfirmDialogFragment newInstance(CharSequence message) {
        public static ConfirmDialogFragment newInstance(int resource, int count) {
        final ConfirmDialogFragment f = new ConfirmDialogFragment();
        final Bundle args = new Bundle();
        // args.putCharSequence(MESSAGE_KEY, message);
        args.putInt(RESOURCE_ID, resource);
        args.putInt(TARGET_SIZE, count);
        f.setArguments(args);
        return f;
        }


        @Override
        public Dialog onCreateDialog(Bundle savedState) {


        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // final CharSequence message = (getArguments()).getCharSequence(MESSAGE_KEY);
        final int resource = (getArguments()).getInt(RESOURCE_ID);
        final int count = (getArguments()).getInt(TARGET_SIZE);
        final CharSequence message = Utils.formatPlural(getActivity(), resource, count);
        builder.setMessage(message)
        .setPositiveButton(R.string.ok, POSITIVE_ACTION)
        .setNegativeButton(R.string.cancel, null);
        return builder.create();
        }


        2). 修改AbstractActivityController.java
        private void confirmAndDelete(int actionId, final Collection<Conversation> target,
        boolean showDialog, int confirmResource) {
        final boolean isBatch = false;
        if (showDialog) {
        makeDialogListener(actionId, isBatch);
        // final CharSequence message = Utils.formatPlural(mContext, confirmResource,
        // target.size());
        final ConfirmDialogFragment c = ConfirmDialogFragment.newInstance(confirmResource,
        target.size());
        c.displayDialog(mActivity.getFragmentManager());
        } else {
        delete(0, target, getDeferredAction(actionId, target, isBatch), isBatch);
        }
        }


        3). 修改SelectedConversationsActionMenu.java
        private void performDestructiveAction(final int action) {
        ......
        if (showDialog) {
        mUpdater.makeDialogListener(action, true /* fromSelectedSet */);
        final int resId;
        if (action == R.id.delete) {
        resId = R.plurals.confirm_delete_conversation;
        } else if (action == R.id.discard_drafts) {
        resId = R.plurals.confirm_discard_drafts_conversation;
        } else {
        resId = R.plurals.confirm_archive_conversation;
        }
        // final CharSequence message = Utils.formatPlural(mContext, resId, conversations.size());
        // final ConfirmDialogFragment c = ConfirmDialogFragment.newInstance(message);
        final ConfirmDialogFragment c = ConfirmDialogFragment.newInstance(resId, conversations.size());
        c.displayDialog(mActivity.getFragmentManager());
        } else {
        // No need to show the dialog, just make a destructive action and destroy the
        // selected set immediately.
        // TODO(viki): Stop using the deferred action here. Use the registered action.
        destroy(action, conversations, mUpdater.getDeferredBatchAction(action));
        }


}


13 在飛行模式下,接受一封會議邀請以後,再關閉飛行模式,會議邀請回复后消失不见
1).手机登陆邮箱后,通过PC发送一封会议邀请到手机;
2).手机收到会议邀请后开启飞行模式;
3).开启飞行模式后查看邮件回复刚才收到的那封会议邀请;
结果:
打开飞行模式, 查看邀请,点击确认,会议邀请消失不见,关闭飞行模式,网络正常,对方也没有收到会议邀请。


解决办法:
   EmailProvider.java#uiUpdateMessage()的一段代码: 
// Special case - meeting response
if (values.containsKey(UIProvider.MessageOperations.RESPOND_COLUMN)) {
final EmailServiceProxy service =
EmailServiceUtils.getServiceForAccount(context, mailbox.mAccountKey);
try {
/// M: Just return if have no connectivity @{
if (!com.mediatek.mail.utils.Utility.hasConnectivity(context)) {
return 1;
}
/// @}
service.sendMeetingResponse(msg.mId,
values.getAsInteger(UIProvider.MessageOperations.RESPOND_COLUMN));
// Delete the message immediately
uiDeleteMessage(uri);
Utility.showToast(context, R.string.confirm_response);
// Notify box has changed so the deletion is reflected in the UI
notifyUIConversationMailbox(mailbox.mId);
} catch (RemoteException e) {
LogUtils.d(TAG, "Remote exception while sending meeting response");
}
return 1;



    对于MeetingRequest 回复这个功能的行为,Google 的确设计的不是非常好,说明下这个功能的概况。


    对于Meeting Request的邮件,会在邮件列表中特别的标识出来,且进入邮件后可以点击Button来回复邮件,Google设计是在用户点击Button时,无论哪个答案,都马上组装一个MeetingResponse给Server,通过类似Send Mail的方式发给 inviter, 中间没有给用户再次编辑的机会,且没有给用户retry的机会,因此如果这次此因为某种原因(网络? Server? RP?)失败了,那这个response就真的不会被Server收到。


    对于这种行为的设计,有一些合理的解释:
    1). Calendar的同步与MeetingResponse 是独立的,因此即使用户不回应Meeting Request,Calendar也可以通过过来,且用户始终有机会在Calendar中改变response。
    2). 发送邮件的行为存在一定的不可靠性,因此如果Client端如Web端一样,做一整套完整的机制来判断邮件是否真正有发生成功会很庞大和费时,作为“轻”的移动端则简化了这个过程,仅做了response,而不去关系此时是否真的可以成功
    3). 以目前Google Android来讲,这是最好的做法,否则需要很大的effort来完善整个功能,比如没有发出去Meeting response需要retry, 如没有发出的邮件一样,这样就需要将组装的邮件暴露给用户,那就不能简单的组装了,需要考虑到用户看到的内容;或者只有当meeting response发出成功后才让会议邀请邮件消失,这样做显然需要确保meeting response发送成功了,但这显然很困难。


    有看到贵司提到华硕的手机会显示没有发出的Meeting Response,我想应该是有做些修改,让他们显示在Outbox中,但如果如贵司所说,邀请者同样是收不到最终的结果,那显示在那里的意义实际上也不大。


    之所以希望保持Google 行为是因为再绝大多数情况下这样的设计是够用的,且用户可以随时在Calendar中再做修改。
    另外需要澄清的是,理论上讲,并不需要收到会议邀请方点Accept,meeting event才会出现在自己的Calendar中。通常邀请者发起一个meeting request后,接收方的server收到邀请,会做两件事,1)将会议邀请组成一封meeting request邮件给接收者的收件箱, 2)想接收者的Calendar中添加一个Meeting Event待处理。 如果收到会议邀请而没有在Calendar中看到Event,可能是因为网络的原因还没同步下来,可以手动同步下看看,如果通过Web看到Server端有没有这个Calendar上的event,则可能是server实现比较特别了。


14 【电子邮件】修改语言为英语电子邮件账户设置快速回复界面的内容还是显示为中文


     


    这是google issue,思想是在登录email 账户之前,就把快速回复这块内容保存到数据库中了,所以当用户登录后去切换语言,这时候只会从数据库中读取登录email账户之前保存的内容,所以不会随着语言的改变而改变,可以作个验证,登录之前先切换,登录成功去看下,发现快速回复也随着语言的切换而切换,目前不建议修改, 改动太大


    这样的好处:每个账户都可以保存自己的快速回复,不同的账户可以保存成不一样的快速回复


    当用户登陆的时候 会调用 AccountSettingsUtils.java 中的函数commitSettings 


    里面的含义就是如果没有保存过的动作会读取default_quick_responses 里面的默认值,如果有保存过的动作就读取修改以后的值




    【【【【【【【【【【【


    这个现象是Email default design。由于Email中可以登录很多不同类型的账户,而每个账户想要设置的快速回复有可能是不一样的,所以在用户在新登录一个Email 账户的时候,Email中就已经将目前语言环境下的快速回复保存到对应的账户里面了,这样做的好处是方便账户信息和每个账户里的快速回复统一。具体code也就是贵司看到的 default_quick_responses 文件AccountSettingsUtils.java 中函数commitSettings 对这些字符串进行了处理的位置。


    】】】】】】】】】】】】】
    15
    [FAQ10289] email中无法登陆gmail邮箱 Download
    Platform:MT6572MT6575MT6577MT6582...
    Branch:JB9JB5JB3JB2...
    FAQ Content
    [DESCRIPTION]
    1)、进入email,输入邮件地址;
    2)、选择手动,选择pop或者IMAP
    3)、点击下一步
    结果:提示无法连接
     
    [SOLUTION]
     
    1)、检查安全策略是否使用正确;
        gmail的安全测领一般要求较高,安全配置信息如下:
    Gmail账户的正确配置是:
    "pop.gmail.com
    (ssl port:995)" 
    pop.gmail.com(ssl port:993)  
    smtp.gmail.com(ssl port:465) 
    "邮箱名称必须与邮件地址一致。Please Set Account Name =Email Address
    接收邮件 (POP3) 服务器 - 需要 SSL: pop.gmail.com
    使用 SSL:是
    端口: 995 
    发送邮件 (SMTP) 服务器 - 需要
    TLS: smtp.gmail.com(使用验证)
    使用验证:是
    使用 STARTTLS:是(某些客户端称其为 SSL)
    端口:465 或 587 
    帐户名:  您的 Gmail 用户名(包括 @gmail.com)
    电子邮件地址:  您的完整 Gmail 电子邮件地址(用户名@gmail.com)
    密码:  您的 Gmail 密码 
    请注意,如果您的客户端不支持 SMTP 验证,您将无法通过客户端用 Gmail 地址发送电子邮件。 。" "Support SSL/TLS
    Imap4/POP3"
    2)、检查如果配置正确仍无法登录,请用同样的配置使用对比机测试;
     
    Note:exchange的方式目前Google已不支持。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值