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

目录
相关文章
|
2月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
133 1
|
2月前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
129 5
|
2月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
2月前
|
Java 开发工具 Android开发
详细解读Android开发DNK开发将.c文件打包成os
详细解读Android开发DNK开发将.c文件打包成os
20 0
|
2月前
|
Android开发
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
76 0
|
2月前
|
缓存 大数据 Android开发
Android 巧用putBinder方法传递大文件
Android 巧用putBinder方法传递大文件
48 0
|
2月前
|
开发工具 Android开发
Android 代码自定义drawble文件实现View圆角背景
Android 代码自定义drawble文件实现View圆角背景
69 0
|
Android开发 开发工具 git
|
2天前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
13 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
1天前
|
搜索推荐 Android开发 iOS开发
探索安卓与iOS开发的差异性与互补性
【8月更文挑战第19天】在移动应用开发的广阔天地中,安卓与iOS两大平台各据一方,引领着行业的潮流。本文将深入探讨这两个平台在开发过程中的不同之处以及它们之间的互补关系,旨在为开发者提供一个全面的视角,帮助他们更好地把握市场动态,优化开发策略。通过分析各自的开发环境、编程语言、用户界面设计、性能考量及市场分布等方面,我们将揭示安卓与iOS开发的独特魅力和挑战,同时指出如何在这两者之间找到平衡点,实现跨平台的成功。