解决切换语言后拨打电话,Android Dialer中显示CallLog通话记录地址的语言未切换

news/2024/10/18 9:21:29/

一、介绍

切换系统语言后,使用Dialer拨打电话后,通话记录显示的地址语言仍未原语言。

二、分析

  • 发现并非翻译问题。
  • 排查CallLog记录确定是写入的地理位置仍为原语言的值。
  • 跟踪地址写入的位置,根据网上提供的通话记录写入流程,追踪logCall()插入方法,一直没有找到地理位置geoDescription的写入。
  • 正确的根源在于地址信息来源,而不是写入的地方。

CallLog的数据库位置:

/data/user/0/com.android.providers.contacts

  • 其中calls.db中的Calls.GEOCODED_LOCATION字段为号码归属地。

原因:

  • 切换语言后,位置信息没有变,导致地理位置的值仍为原语言。
  • 默认切换语言后,没有更新mLocate的值,导致写入通话记录的地理位置信息没有切换语言。

代码逻辑:

  • addComputedValues()方法调用了getGeocodedLocationFor()
  • 在getGeocodedLocationFor()中传入mLocate获取地理信息,此处影响获取的值的语言类型。
class DefaultCallLogInsertionHelper implements CallLogInsertionHelper {//...private final Locale mLocale;//切换语言时该值没有更新,仍为如下构建时的值//...private DefaultCallLogInsertionHelper(Context context) {mCountryMonitor = new CountryMonitor(context);mLocale = context.getResources().getConfiguration().locale;}//被addComputedValues()调用的方法,传入mLocate,该值不正确导致CallLog存入的地址信息错误。	@Overridepublic String getGeocodedLocationFor(String number, String countryIso) {PhoneNumber structuredPhoneNumber = parsePhoneNumber(number, countryIso);if (structuredPhoneNumber != null) {return getPhoneNumberOfflineGeocoder().getDescriptionForNumber(structuredPhoneNumber, mLocale);} else {return null;}}
}

三、解决

  • 在ContactsProvider中解决。
  • 在切换语言后,更新mLocate的取值。

packages\providers\ContactsProvider

1.DefaultCallLogInsertionHelper.java

//com\android\providers\contacts\DefaultCallLogInsertionHelper.java
class DefaultCallLogInsertionHelper implements CallLogInsertionHelper {//...private Locale mLocale;//删除final限制。//新增更新方法,在每次更新的时候触发。protected void updateLocale(Locale locale){mLocale = locale;}
}

2.ContactsProvider2.java

  • 添加对DefaultCallLogInsertionHelper中updateLocale()方法的调用
//com\android\providers\contacts\ContactsProvider2.java
/*** Verifies that the contacts database is properly configured for the current locale.* If not, changes the database locale to the current locale using an asynchronous task.* This needs to be done asynchronously because the process involves rebuilding* large data structures (name lookup, sort keys), which can take minutes on* a large set of contacts.*/protected void updateLocaleInBackground() {// The process is already running - postpone the changeif (mProviderStatus == STATUS_CHANGING_LOCALE) {return;}final LocaleSet currentLocales = mCurrentLocales;final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());if (!needsToUpdateLocaleData(prefs, currentLocales, mContactsHelper, mProfileHelper)) {return;}int providerStatus = mProviderStatus;setProviderStatus(STATUS_CHANGING_LOCALE);mContactsHelper.setLocale(currentLocales);mProfileHelper.setLocale(currentLocales);mSearchIndexManager.updateIndex(true);prefs.edit().putString(PREF_LOCALE, currentLocales.toString()).commit();setProviderStatus(providerStatus);//新增的方法,更新mLocate。DefaultCallLogInsertionHelper.getInstance(getContext()).updateLocale(currentLocales.getPrimaryLocale());// The system locale set might have changed while we've being updating the locales.// So double check.if (!mCurrentLocales.isCurrent()) {scheduleBackgroundTask(BACKGROUND_TASK_CHANGE_LOCALE);}}

http://www.ppmy.cn/news/462008.html

相关文章

新知实验室__TRTC使用WebSDK和UI集成的小程序组TUICalling 实现Web和小程序端的拨打电话

webRTC 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。 第一步…

蓝牙电话之HFP-通话

蓝牙电话之HFP-通话 文章《蓝牙电话之HFP-连接》里已经对HFP的连接进行了简单分析,这篇主要和大家探讨下通话场景下的相关操作,如拨打、接听、挂断电话(AG侧、HF侧)、切换声道这几个场景。 蓝牙通话中主要涉及到以下两个方面的关…

如何在Android中使用Intent拨打电话?

本文翻译自:How to make a phone call using intent in Android? Im using the following code to make a call in Android but it is giving me security exception please help. 我正在使用以下代码在Android中拨打电话,但这给我带来了安全异常&#…

无法在Android手机上拨打或接听电话,如何解决

使用Android,拨打和接听电话变得更加容易。您可以在几分之一秒内与其他联系人建立联系。但是,一些用户在无法在Android手机上拨打或接听电话时不断抱怨这些情况。在这样的时刻,当你看到周围的每个人都忙于他们的智能手机,你甚至不…

android拨打电话无法跳转到通话界面

最近客户要求我们用谷歌的dialer替换原生的dialer,替换之后发现在拨打电话的时候无法跳转到指定的界面.通过阅读源码发现,telecom固定的了跳转的界面. packages/services/Telecomm/src/com/android/server/telecom/InCallController.java public InCallController(Context con…

python 实现手机自动拨打电话(通话压力测试)

现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率。 今天说下用python结合adb命令去实现安卓手机端的通话压力测试。 #操作前先在设置里打开power键可以结束通话按钮,否则会导致代码报错 from time impor…

Android如何判断手机是否处于正在通话中,通话状态的判断

1. 如何判断手机是否处于正在通话中?(任何时候都可以判断手机是否处于通过中) private boolean phoneIsInUse() { boolean phoneInUse false; try { ITelephony phone ITelephony.Stub.asInterface(ServiceManager.checkService("pho…

小米8android系统,小米8:2021年,是时候说再见了!

众所周知,一款安卓手机的使用周期大概是在2-3年。在这之后,很多用户都会选择更新换代。小米8,作为小米发布已经两年半的机型,现在也到了要和我们说再见的时候了。那么,作为小米曾经的数字旗舰,小米8还能不能…