Export the Contacts as VCF file

前端 未结 8 652
梦毁少年i
梦毁少年i 2020-12-01 03:16

I want to export the Phone contacts to External storage area. I didn\'t work with this type of method. Anyone guide me to do this?

相关标签:
8条回答
  • 2020-12-01 03:42
    private void convertToVcfFile(String contactId, File contactFile) {
        Cursor mCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, ContactsContract.CommonDataKinds.Phone._ID + " = " + contactId,
                null, null);
        if(mCursor != null && mCursor.moveToFirst()) {
            do {
                String mLookupKey = mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                Uri mUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, mLookupKey);
                try {
                    AssetFileDescriptor mAssetFileDescriptor = getContentResolver().openAssetFileDescriptor(mUri, "r");
                    if (mAssetFileDescriptor != null) {
                        FileInputStream mFileInputStream = mAssetFileDescriptor.createInputStream();
                        byte[] mBuffer = new byte[(int) mAssetFileDescriptor.getDeclaredLength()];
                        mFileInputStream.read(mBuffer);
                        String VCardString = new String(mBuffer);
                        FileOutputStream mFileOutputStream = new FileOutputStream(contactFile, true);
                        mFileOutputStream.write(VCardString.getBytes());
                    }
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            } while (mCursor.moveToNext());
            mCursor.close();
        }
    }
    
    0 讨论(0)
  • 2020-12-01 03:44

    Try out this. its work for me to create a .vcf file of all contact and stored it into SDCARD.

    make sure all permission are give properly.

    public static void getVCF() 
    
    {
    
     final String vfile = "POContactsRestore.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();
         }
    
     }
    }
    
    0 讨论(0)
  • 2020-12-01 03:47
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.ContactsContract;
    import android.app.Activity;
    import android.content.res.AssetFileDescriptor;
    import android.database.Cursor;
    import android.util.Log;
    
    public class Contacts extends Activity{
    
        Cursor cursor;
    ArrayList<String> vCard ;
    String vfile;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        try {
            getVcardString();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private void getVcardString() throws IOException {
    
         final String vfile = "POContactsRestore.vcf";
        // TODO Auto-generated method stub
        vCard = new ArrayList<String>();
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        if(cursor!=null&&cursor.getCount()>0)
        {
            int i;
            String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
            FileOutputStream mFileOutputStream = new FileOutputStream(storage_path, false);
            cursor.moveToFirst();
            for(i = 0;i<cursor.getCount();i++)
            {
                get(cursor);
                Log.d("TAG", "Contact "+(i+1)+"VcF String is"+vCard.get(i));
                cursor.moveToNext();
                mFileOutputStream.write(vCard.get(i).toString().getBytes());
            }
            mFileOutputStream.close();
            cursor.close();
        }
        else
        {
            Log.d("TAG", "No Contacts in Your Phone");
        }
    }
    private void get(Cursor cursor2) {
        String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
        Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
        AssetFileDescriptor fd;
        try {
            fd = this.getContentResolver().openAssetFileDescriptor(uri, "r");
    
            FileInputStream fis = fd.createInputStream();
            byte[] buf = new byte[(int) fd.getDeclaredLength()];
            fis.read(buf);
            String vcardstring= new String(buf);
            vCard.add(vcardstring);
        } catch (Exception e1) 
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    
    
    
    
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.anthem.contactbackup"
    android:versionCode="1"
    android:versionName="1.0" >
    
    <uses-sdk
        android:minSdkVersion="5"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".Con"
            android:label="@string/title_activity_contact_backup" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    

    0 讨论(0)
  • 2020-12-01 03:58

    It's working for me and as well working in Nougat devices. Thank you so much @pratik and @sanat .

    public static void getVCF(Context context)
        {
    
            final String vfile = "POContactsRestore.vcf";
    
            Cursor phones = context.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 = context.getContentResolver().openAssetFileDescriptor(uri, "r");
                    FileInputStream fis = fd.createInputStream();
                    byte[] buf = readBytes(fis);
                    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();
                }
    
            }
        }
    
        public static byte[] readBytes(InputStream inputStream) throws IOException {
            // this dynamically extends to take the bytes you read
            ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
    
            // this is storage overwritten on each iteration with bytes
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
    
            // we need to know how may bytes were read to write them to the byteBuffer
            int len = 0;
            while ((len = inputStream.read(buffer)) != -1) {
                byteBuffer.write(buffer, 0, len);
            }
    
            // and then we can return your byte array.
            return byteBuffer.toByteArray();
        }
    
    0 讨论(0)
  • 2020-12-01 03:59

    I have removed the exception and other error and below is my CODE :

        private final String vfile = "POContactsRestore.vcf";
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        null, null, null);
                phones.moveToFirst();
                String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
                AssetFileDescriptor fd;
                try {
                    fd = 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, false);
                    mFileOutputStream.write(vCard.toString().getBytes());
                    Log.d("Vcard",  vCard);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
    

    If you can iterate through loop and get the vCard for the contacts and store it in the SDCARD.

    0 讨论(0)
  • 2020-12-01 04:03

    In your code, you wrote one function but from where is this function called? And what is the meaning of get(View view) function? This function is not being called so it can be removed.

    I've edited my answer as per your requirements and tested it with 500 Contacts to save a single vCard file with 500 contacts in my sd card.

    package com.vcard;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.content.res.AssetFileDescriptor;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.ContactsContract;
    import android.util.Log;
    import android.view.View;
    
    public class VCardActivity extends Activity 
    {
        Cursor cursor;
        ArrayList<String> vCard ;
        String vfile;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            vfile = "Contacts" + "_" + System.currentTimeMillis()+".vcf";
            /**This Function For Vcard And here i take one Array List in Which i store every Vcard String of Every Conatact
             * Here i take one Cursor and this cursor is not null and its count>0 than i repeat one loop up to cursor.getcount() means Up to number of phone contacts.
             * And in Every Loop i can make vcard string and store in Array list which i declared as a Global.
             * And in Every Loop i move cursor next and print log in logcat.
             * */
            getVcardString();
    
        }
        private void getVcardString() {
            // TODO Auto-generated method stub
            vCard = new ArrayList<String>();
            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            if(cursor!=null&&cursor.getCount()>0)
            {
                cursor.moveToFirst();
                for(int i =0;i<cursor.getCount();i++)
                {
    
                    get(cursor);
                    Log.d("TAG", "Contact "+(i+1)+"VcF String is"+vCard.get(i));
                    cursor.moveToNext();
                }
    
            }
            else
            {
                Log.d("TAG", "No Contacts in Your Phone");
            }
    
        }
    
        public void get(Cursor cursor)
        {
    
    
            //cursor.moveToFirst();
            String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
            AssetFileDescriptor fd;
            try {
                fd = this.getContentResolver().openAssetFileDescriptor(uri, "r");
    
                // Your Complex Code and you used function without loop so how can you get all Contacts Vcard.??
    
    
               /* 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 out = new FileOutputStream(path);
                out.write(VCard.toString().getBytes());
                Log.d("Vcard",  VCard);*/
    
                FileInputStream fis = fd.createInputStream();
                byte[] buf = new byte[(int) fd.getDeclaredLength()];
                fis.read(buf);
                String vcardstring= new String(buf);
                vCard.add(vcardstring);
    
                String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
                FileOutputStream mFileOutputStream = new FileOutputStream(storage_path, false);
                mFileOutputStream.write(vcardstring.toString().getBytes());
    
            } catch (Exception e1) 
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题