200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > android12.0(S) 从SD卡导入vCard文件到通讯录 号码带“-“ 如何把横线去除

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

时间:2023-04-01 18:22:52

相关推荐

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

问题现象

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

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

String source = "15588886666";//normalint 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 - bugreturn 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 --><activityandroid: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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。