Android:如何将联系人保存到 SD 卡作为 vCard。没有重复项?

2023-11-29

我正在尝试将手机上的所有联系人作为 .vcf 文件 (vCard) 保存到 SD 卡中。它有效,但我有一个问题。每个具有多个电话号码(手机号码和工作号码)的联系人都会保存两次。这两个号码都在每个重复的联系人中,因此它们是正确的,只是重复的。有人可以告诉我如何解决这个问题吗?我的代码是:

File delete=new File(Environment.getExternalStorageDirectory()+"/Contacts.vcf");

     if (delete.exists()) {
       delete.delete();

     }

    Cursor phones = ContactService.this.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null, null, null);
    phones.moveToFirst();
      for(int i =0;i<phones.getCount();i++)
      {
         String lookupKey =  phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
        Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);


       AssetFileDescriptor fd;
        try 
        {
            fd = ContactService.this.getContentResolver().openAssetFileDescriptor(uri, "r");
            FileInputStream fis = fd.createInputStream();
            byte[] buf = new byte[(int) fd.getDeclaredLength()];
            fis.read(buf);
            String VCard = new String(buf);
            String path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
            FileOutputStream mFileOutputStream = new FileOutputStream(path, true);
                       mFileOutputStream.write(VCard.toString().getBytes());           
            phones.moveToNext();             
        } 
        catch (Exception e1) 
        {
             // TODO Auto-generated catch block
             e1.printStackTrace();
        }


      }

感谢您的帮助。


使用以下代码将联系人数据作为 vcf 文件保存到设备 SD 卡中。

public class VCardActivity extends Activity {
    Cursor cursor;
    ArrayList<String> vCard;
    String vfile;
    static Context mContext;

    /** Called when the activity is first created. */
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mContext = VCardActivity.this;
            getVCF();
        }

        public static void getVCF() {
            final String vfile = "Contacts.vcf";
            Cursor phones = mContext.getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            phones.moveToFirst();
            for (int i = 0; i < phones.getCount(); i++) {
                String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
                AssetFileDescriptor fd;
                try {
                    fd = mContext.getContentResolver().openAssetFileDescriptor(uri, "r");
                    FileInputStream fis = fd.createInputStream();
                    byte[] buf = new byte[(int) fd.getDeclaredLength()];
                    fis.read(buf);
                    String VCard = new String(buf);
                    String path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
                    FileOutputStream mFileOutputStream = new FileOutputStream(path, true);
                    mFileOutputStream.write(VCard.toString().getBytes());
                    phones.moveToNext();
                    Log.d("Vcard", VCard);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }
    }

并查看下面的链接以获取更多信息。

将联系人导出为 VCF 文件

并向您授予以下权限androidmanifest.xml file.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:如何将联系人保存到 SD 卡作为 vCard。没有重复项? 的相关文章

  • 在 android volley 中使用 StringRequest 时如何处理响应中的对象数组

    我有安卓应用程序 在该应用程序中 我在服务器上发布一些字符串数据并获得一些响应 问题是 我收到 jsonstring 中的响应 但我希望此数据位于 json 数组中 尽管当我使用 JsonArrayRequest 时 它不允许在参数中使用
  • 我所有的布局 xml 文件都变成了自动生成的文件

    昨天我的应用程序上的所有内容都运行完美 但今天当我打开 Android Studio 时 所有 xml 文件都已损坏 不确定这是否是正确的术语 每个人都是这样的 我今天遇到了同样的问题 下面是我所做的几个步骤 我取得了成功来解决这个问题 只
  • 如何随着 ViewPager 位置偏移量的变化对视图进行动画处理

    我们希望创建一个带有动画的应用程序介绍 用户可以在其中滚动页面 并且当用户滚动时 视图会动画化并遍历所有幻灯片 动画视图应该随着用户滚动而移动 因此如果用户滚动得更快 动画视图应该移动得更快 如果用户滚动回到上一页 动画视图应该向后移动 这
  • React Native 检查平板电脑或屏幕是否以英寸为单位

    我为平板电脑和移动设备建立了不同的渲染逻辑 我想知道是否有办法获取屏幕尺寸 以英寸为单位 或者甚至可能是任何模块自动检测设备是否是平板电脑 我没有直接使用尺寸 API 来获取屏幕分辨率的原因是 许多 Android 平板电脑的分辨率低于许多
  • 为 DownloadManager 的 BroadcastReceiver 设置附加功能 [重复]

    这个问题在这里已经有答案了 有一种方法可以添加额外内容DownloadManager已登记行动意图DownloadManager ACTION DOWNLOAD COMPLETE 例如 接收一个在意图中设置为额外的布尔值 这就是我创建请求的
  • Android P Beta - AlarmManager 通知不起作用

    我正在 Android P beta 版本 4 上测试我的应用程序 我的应用程序目标SdkVersion是27 据观察 警报管理器通知未按预期工作 我使用下面的代码来设置通知 if android os Build VERSION SDK
  • 如何让Service即使被系统杀死也无法删除?

    我正在创建一个蓝光过滤器应用程序 因此 我想显示所有应用程序的视图 我通过以下服务做到了 public class OverlayService extends Service public OverlayService View mVie
  • Android NumberPicker 带字符串

    I have customised the NumberPicker to show text The output is this 当我按 确定 时 我想将 e x 鼠标添加到我的列表 文章 中 我得到的是索引值 int 它由 array
  • Firebase 查询 Or'ing whereEqualTo 以获得可能值的列表

    我见过之前针对早期版本的 Firebase 提出过这个问题 https stackoverflow com questions 26700924 query based on multiple where clauses in fireba
  • 如何通过 Android 中的 Google Fit 集成获取用户信息

    我正在将 Google Fit 应用程序集成到 Android 应用程序中 以使用 SENSORS API 和 HISTORY API 跟踪健身数据 获取步数 如何使用该 API 获取用户信息 电子邮件或用户 ID 对你来说完美的例子 这可
  • 从 ios 和 android 端连接到 xmpp 时获取所有群组消息

    我在用开放火版本 4 0 1 使用开火Rest Api https github com gidkom php openfire restapi我在服务 servicename xx xx xxx xxx 中创建了群聊室 现在房间已创建 发
  • Android TableRow 垂直拉伸以填充屏幕

    我正在尝试创建一个电话拨号器视图 使用 TableLayout 在 3x4 网格中创建 12 个按钮 我希望行垂直拉伸以平等地使用所有可用空间 但似乎 fill parent 在 TableRows 上不起作用 我不想使用 setMinim
  • 通过 id 查找 视图?

    如果视图是 id 是否可以通过 id 查找视图
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 拦截来自外部应用程序的意图

    假设我想开发一个以某种方式扩展的应用程序 让我说 合作 非常受欢迎的应用程序我显然无法控制 为了简单起见 我们还假设非常著名的应用程序作者不会发布更新来阻止我的应用程序 我研究了该应用程序的功能并发现它广泛使用BroadcastReceiv
  • CollapsingToolbarLayout 禁用绘制扩展

    我有一个已有条件禁用的 CollapsingToolbar 当用户在这种情况下加载视图时 它看起来就像一个普通的 ToolBar 对象 唯一奇怪的是 如果它们向下拖动 例如在拉动刷新样式操作中 折叠工具栏就会展开 尽管我的愿望和代码与此相反
  • ProGuard 与 Android:java.lang.NoSuchMethodError:android.util.Xml.asAttributeSet

    当 ProGuard 被禁用时 我的应用程序运行正常 启用ProGuard后 应用程序将导出为apk并安装到模拟器中 然后当我在模拟器中运行它时 强制关闭 05 10 11 14 10 582 E AndroidRuntime 759 FA
  • Android 在通话期间播放音频文件[重复]

    这个问题在这里已经有答案了 对于我的 Android 应用程序 我想在从应用程序接听电话后播放音频文件 应用程序将发起电话呼叫 一旦接收者接听电话 应用程序应开始播放录制的音频文件 通过在谷歌上进行大量搜索 我发现这对于未root的设备来说
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提

随机推荐