Android11 车载 Framework PBAP同步电话簿怎么增加姓名全拼和首字母的需求

原理剖析

PBAP同步电话簿功用是

  1. 首先车机经过蓝牙连接手机。
  2. 车时机经过蓝牙树立的连接。
  3. 下载手机中的联系人到车机中的数据库去。
  4. 然后再由车机的蓝牙电话App查询数据库来显现电话。

Android11 车载 Framework  PBAP同步电话簿如何添加姓名全拼和首字母的需求

这儿只是大约介绍一下流程。具体的进程这儿就不具体讲解了

数据库增加全拼和首字母这个需求,是在ContactsProvider这个app中修正 ContactsProvider保存联系人的App 好的 首先咱们下载一下联系人的数据库 用如下的办法

  • adb root
  • adb remount
  • adb pull /data/data/com.android.providers.contacts/databases/contacts2.db

翻开数据库经过我长期的剖析,数据库中view_data视图中,sort_key字段,假如联系人姓名是英文是有值的(值为英文称号),可是中文就没有值, phonebook_label也是英文就是首字母,中文同样没有值,这样咱们确定了sort_key和phonebook_label是全拼和首字母,咱们就可以写代码了 所以咱们写入数据库的时候 中文给 sort_key和phonebook_label赋值就可以。

好了找代码的进程我就不讲了,很长的时刻我找到了关键代码,是在

packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java
在办法 
public void updateRawContactDisplayName(SQLiteDatabase db, long rawContactId) {
//displayNamePrimary  这个是联系人的称号 是用来做中文转英文的
bindString(rawContactDisplayNameUpdate, 2, displayNamePrimary);
......
//sortKeyPrimary  这个就是存储的称号全拼
bindString(rawContactDisplayNameUpdate, 6, sortKeyPrimary);
....
//phonebookLabelPrimary  这个存储的是称号首字母
bindString(rawContactDisplayNameUpdate, 7, phonebookLabelPrimary);
......................
}

完成进程

代码位于packages/providers/ContactsProvider

  • 下载中文转英文的库,tinypinyin,需求两个库 ahocorasick-0.3.0.jar和tinypinyin-2.0.3.jar

下载地址 链接:pan.baidu.com/s/13TzWvMMw… 提取码:1234

  • 把这个两个库放到ContactsProvider目录下的libs文件夹下(假如没有请新建libs目录)

Android11 车载 Framework  PBAP同步电话簿如何添加姓名全拼和首字母的需求

  • Android.bp文件增加如下代码:
java_import {
    name: "tinypinyin-2.0.3",
    jars: ["libs/tinypinyin-2.0.3.jar","libs/ahocorasick-0.3.0.jar"],
}
android_app {
    ...............
    static_libs: [
        "android-common",
        "com.android.vcard",
        "guava",
        "tinypinyin-2.0.3"
    ],
.............

完整Android.bp代码如下:

Android.bp
java_import {
    name: "tinypinyin-2.0.3",
    jars: ["libs/tinypinyin-2.0.3.jar","libs/ahocorasick-0.3.0.jar"],
}
android_app {
    name: "ContactsProvider",
    // Only compile source java files in this apk.
    srcs: [
        "src/**/*.java",
        "src/com/android/providers/contacts/EventLogTags.logtags",
    ],
    libs: [
        "ext"
    ],
    static_libs: [
        "android-common",
        "com.android.vcard",
        "guava",
        "tinypinyin-2.0.3"
    ],
    // The Jacoco tool analyzes code coverage when running unit tests on the
    // application. This configuration line selects which packages will be analyzed,
    // leaving out code which is tested by other means (e.g. static libraries) that
    // would dilute the coverage results. These options do not affect regular
    // production builds.
    jacoco: {
        include_filter: ["com.android.providers.contacts.*"],
    },
    platform_apis: true,
    certificate: "shared",
    privileged: true,
    optimize: {
        proguard_flags_files: ["proguard.flags"],
    },
}

然后修正packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java中代码

//在ContactsDatabaseHelper.java中增加如下办法
ContactsDatabaseHelper.java
private void initPinyinConfig(){
    // 增加自定义词典 因为库会把张转化成Chang 多音字 所以修正一下
    Pinyin.init(Pinyin.newConfig()
            .with(new PinyinMapDict() {
                @Override
                public Map<String, String[]> mapping() {
                    HashMap<String, String[]> map = new HashMap<String, String[]>();
                    map.put("长", new String[]{"CHANG"});
                    map.put("张", new String[]{"ZHANG"});
                    map.put("重", new String[]{"CHONG"});
                    return map;
                }
            }));
}
//结构办法调用一下
protected ContactsDatabaseHelper(
        Context context, String databaseName, boolean optimizationEnabled,
        boolean isTestInstance) {
    ........................
    initPinyinConfig();
}
//然后在办法updateRawContactDisplayName完成该功用
public void updateRawContactDisplayName(SQLiteDatabase db, long rawContactId) {
.......................
//增加全拼和首字母start
//全拼
String fullpinyin = Pinyin.toPinyin(displayNamePrimary, "");
if (TextUtils.isEmpty(fullpinyin)) {
    fullpinyin = "";
}else{
    //因为英文转化后是小写 中文转化后为大写 为了保持一直 这儿悉数转大写
    fullpinyin=fullpinyin.toUpperCase();
}
sortKeyPrimary=fullpinyin;
//首字母
String firstPinyin = "";
if (fullpinyin.length() > 0) {
    firstPinyin = fullpinyin.substring(0, 1);
}
phonebookLabelPrimary = firstPinyin;
//增加全拼和首字母联系人end
//下面的代码是源码本身的不用修正,记得这个位置
final SQLiteStatement rawContactDisplayNameUpdate = db.compileStatement(
            "UPDATE " + Tables.RAW_CONTACTS +
            " SET " +
                    RawContacts.DISPLAY_NAME_SOURCE + "=?," +
                    RawContacts.DISPLAY_NAME_PRIMARY + "=?," +
                    RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," +
                    RawContacts.PHONETIC_NAME + "=?," +
                    RawContacts.PHONETIC_NAME_STYLE + "=?," +
                    RawContacts.SORT_KEY_PRIMARY + "=?," +
                    RawContactsColumns.PHONEBOOK_LABEL_PRIMARY + "=?," +
                    RawContactsColumns.PHONEBOOK_BUCKET_PRIMARY + "=?," +
                    RawContacts.SORT_KEY_ALTERNATIVE + "=?," +
                    RawContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE + "=?," +
                    RawContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE + "=?" +
            " WHERE " + RawContacts._ID + "=?");
rawContactDisplayNameUpdate.bindLong(1, bestDisplayNameSource);
bindString(rawContactDisplayNameUpdate, 2, displayNamePrimary);
bindString(rawContactDisplayNameUpdate, 3, displayNameAlternative);
bindString(rawContactDisplayNameUpdate, 4, bestPhoneticName);
rawContactDisplayNameUpdate.bindLong(5, bestPhoneticNameStyle);
bindString(rawContactDisplayNameUpdate, 6, sortKeyPrimary);
bindString(rawContactDisplayNameUpdate, 7, phonebookLabelPrimary);
................................
}
记得引入包名
import java.util.List;
import java.util.ArrayList;
import com.github.promeg.pinyinhelper.Pinyin;
import com.github.promeg.pinyinhelper.PinyinMapDict;
import java.util.HashMap;
import java.util.Map;

然后使用mm编译后 找到这个编译出来的ContactsProvider.apk 经过

  • adb root
  • adb remount
  • adb push ContactsProvider.apk /system/priv-app/ContactsProvider/ContactsProvider.apk
  • adb reboot 这样就生效了