android12.0(S) 从SD卡导入vCard文件到通讯录 号码带“-“ 如何把横线去除

简介: android12.0(S) 从SD卡导入vCard文件到通讯录 号码带“-“ 如何把横线去除

问题现象


导入号码格式核心代码如下,其中参数 defaultFormattingType 设置为 FORMAT_NANP

最终得到号码为1-558-888-6666,参数设置为 FORMAT_JAPAN 则正常


        String source = "15588886666";
        //normal
        int defaultFormattingType = PhoneNumberUtils.FORMAT_JAPAN;
        //bug
//        int defaultFormattingType = PhoneNumberUtils.FORMAT_NANP;
        final SpannableStringBuilder text = new SpannableStringBuilder(source);
        PhoneNumberUtils.formatNumber(text, defaultFormattingType);
        String phone = text.toString();
        Log.d("Provision","phone="+phone);

解决办法


frameworks/opt/vcard/java/com/android/vcard/VCardUtils.java

    public static int getPhoneNumberFormat(final int vcardType) {
        if (VCardConfig.isJapaneseDevice(vcardType)) {
            return PhoneNumberUtils.FORMAT_JAPAN;
        } else {
            // return PhoneNumberUtils.FORMAT_NANP;//cczheng fix import phone with - bug
            return PhoneNumberUtils.FORMAT_JAPAN;
        }
    }

导入 vcf 联系人调用代码如下

  private void importVCard(){
    File file = new File("/sdcard/test.vcf");
        Uri uriProvider = FileProvider.getUriForFile(this, "xxxxx.fileprovider", file);
    //Uri uriFile = Uri.fromFile(file);
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(uri, "text/x-vcard");
    startActivity(intent);
  }


可以看到实际上跳转系统界面去导入,经过查找发现跳转的目的地就是 Contacts 应用,如果安装了其它联系人应用比如谷歌 contact,

会弹框提示要选用那一个。高版本安卓系统,不能直接访问 sdcard 文件,传递 uri 也是无用的,若要不跳转 Contact 界面中再去手动选择

vcf 文件,则将 Contacts 改为 uid system 属性即可


packages\apps\Contacts\AndroidManifest.xml

        <!-- vCard related -->
        <activity
            android:name=".vcard.ImportVCardActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:exported="true"
            android:theme="@style/BackgroundOnlyTheme">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <data android:mimeType="text/directory"/>
                <data android:mimeType="text/vcard"/>
                <data android:mimeType="text/x-vcard"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

具体流程如下


Contact

|

|----传递 vcf 文件 uri 至 ImportVCardActivity

|----解析构造 ImportRequest 后 VCardService 调用 handleImportRequest 处理

|----实际通过线程 ImportProcessor 调用 runInternal() 转至下方 vcard


vcard

|

|----VCardEntryConstructor onEntryStarted

|----VCardEntry addPhone

|----VCardUtils getPhoneNumberFormat

|----PhoneNumberUtilsPort formatNumber

目录
相关文章
|
5天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
16 1
|
2月前
|
Android开发
安卓SO层开发 -- 编译指定平台的SO文件
安卓SO层开发 -- 编译指定平台的SO文件
33 0
|
5天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
36 1
|
5天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
23 1
|
5天前
|
Android开发
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
3 0
|
29天前
|
Java Android开发
Android Studio的使用导入第三方Jar包
Android Studio的使用导入第三方Jar包
12 1
|
2月前
|
JSON Java Go
|
2月前
|
算法 Java Android开发
安卓逆向 -- 调用其他APK的SO文件
安卓逆向 -- 调用其他APK的SO文件
17 0
|
2月前
|
Android开发
安卓逆向 -- Hook多个dex文件
安卓逆向 -- Hook多个dex文件
19 1
|
3月前
|
IDE 开发工具 Android开发
Android Studio 下发布项目成APK文件
Android Studio 下发布项目成APK文件
118 1