Android如何发送多个联系人附加在单个.vcf文件中并发送到邮件?

时间:2012-10-09 10:26:46

标签: android contacts vcf

在我的应用程序中,一些联系人被附加到单个 .vcf 文件并且该文件被发送到邮件,尝试将此所有联系人数据显示在log cat中,但无法发送所有数据附加到单个.vcf文件?

任何人都有这个帮助我的想法,请。

这是我的代码

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);  

    vCard = new ArrayList<String>();                 

    Log.i("TAG one", "vfile" +vfile);
    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 Contact 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() { 

    cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
    Log.i("TAG two", "cursor" +cursor);
    if (cursor != null && cursor.getCount() > 0) {
        cursor.moveToFirst();
        Log.i("Number of contacts", "cursorCount" +cursor.getCount());          

        for (int i = 0; i < cursor.getCount(); i++) {                       
            get(cursor);                    
            Log.i("TAG send contacts",  "Contact " + (i + 1) + "VcF String is" +  vCard.get(i));                     
            cursor.moveToNext();                                        
        }           

        StringBuffer s = new StringBuffer();
        s.append( vCard.toString());                
        string = s.toString();                           
        file = new File(string);        

    //  Log.i("s", ""+s);   
    //  Log.i("string", ""+string); 
        Log.i("file", ""+file);             

    } else {
        Log.i("TAG", "No Contacts in Your Phone");
    }        
}       

public void get(Cursor cursor) {

    String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
    Log.i("lookupKey", ""+lookupKey);
    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);     

    try {
        AssetFileDescriptor 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);          

        String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
        FileOutputStream mFileOutputStream = new FileOutputStream(storage_path, true);
        mFileOutputStream.write(vcardstring.toString().getBytes());

        vCard.add(storage_path);            

    } catch (Exception e1)  {            
        e1.printStackTrace();
    }
}       

private void data() {       

    File filelocation = file;     
    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
    sharingIntent.setType("vnd.android.cursor.dir/email");      
    sharingIntent.setType("application/x-vcard");             
    sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+filelocation));
    startActivity(Intent.createChooser(sharingIntent, "Send email"));            
}
}    

2 个答案:

答案 0 :(得分:6)

最后我的问题就像这样解决了

     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);     

     mContext = this; 

     button = (Button) findViewById(R.id.send);          
     button.setOnClickListener(new OnClickListener() {          
        public void onClick(View v) {        
            data();
        }
    });                      

    /**
     * This Function For Vcard And here i take one Array List in Which i
     * store every Vcard String of Every Contact 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();           
}       

 public static void getVcardString() {   

    String path = null;     
    String vfile = null;

     vfile = "Contacts.vcf";           
    Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    null, null, null);

    phones.moveToFirst();
    Log.i("Number of contacts", "cursorCount" +phones.getCount());  
    for(int i =0;i<phones.getCount();i++)   {       

         String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
         Log.i("lookupKey", " " +lookupKey);
         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);          

             path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
             FileOutputStream mFileOutputStream = new FileOutputStream(path, true);
             mFileOutputStream.write(VCard.toString().getBytes());    

             phones.moveToNext();               

             filevcf = new File(path);
             Log.i("file", "file" +filevcf);

         }catch(Exception e1) {
             e1.printStackTrace();  
         }
    }       
    Log.i("TAG", "No Contacts in Your Phone");          
}

protected void data() {             
    File filelocation = filevcf ;     
    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
    sharingIntent.setType("vnd.android.cursor.dir/email");      
    sharingIntent.setType("application/x-vcard");       
    sharingIntent.putExtra(Intent.EXTRA_EMAIL, "mail@gmail.com" );        
    sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+filelocation.getAbsolutePath()));
    startActivity(Intent.createChooser(sharingIntent, "Send email"));            
 }  

答案 1 :(得分:2)

我成功测试了以下内容。对代码的更改以“CHANGE:”开头的注释表示。不要忘记在清单中加android.permission.WRITE_EXTERNAL_STORAGE

public class MainActivity extends Activity {
    private String vfile;
    private Cursor cursor;
    private ArrayList<String> vCard;
    private String string;
    private File file;
    private String storage_path; //CHANGE:  storage_path global

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vCard = new ArrayList<String>();                 

        Log.i("TAG one", "vfile" + vfile);
        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 Contact 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();    
        data(); //CHANGE: now calling data to send vCard intent
    }

    private void getVcardString() { 

       cursor =  getContentResolver().
       query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
       null, null, null, null);
       Log.i("TAG two", "cursor" +cursor);
       if (cursor != null && cursor.getCount() > 0) {
       cursor.moveToFirst();
       Log.i("Number of contacts", "cursorCount" +cursor.getCount());          

       for (int i = 0; i < cursor.getCount(); i++) {                       
            get(cursor);                    
            Log.i("TAG send contacts",  
            "Contact " + (i + 1) + "VcF String is" +  vCard.get(i));                     
            cursor.moveToNext();                                        
        }           

//            StringBuffer s = new StringBuffer(); CHANGE: not needed
//            s.append( vCard.toString());                
//            string = s.toString();                           
//            file = new File(string); //CHANGE: this is not what file should be        

        } else {
            Log.i("TAG", "No Contacts in Your Phone");
        }        
    }       

    public void get(Cursor cursor) {

        String lookupKey =     cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
        Log.i("lookupKey", ""+lookupKey);
        Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);     

        try {
            AssetFileDescriptor 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); //CHANGE: added this, so log statement in above method doesn't generate error

//            String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
            //CHANGE: this is the path we need to get file for intent:
            storage_path = getExternalFilesDir(null).toString() + File.separator + vfile;            
            Log.i("MainActivity", storage_path);
            //CHANGE: this will create the file we need:
            file = new File(getExternalFilesDir(null), vfile);
            file.createNewFile(); //CHANGE
            //CHANGE: this will create the stream we need:
            FileOutputStream mFileOutputStream = new FileOutputStream(file, true); 
            mFileOutputStream.write(vcardstring.toString().getBytes());
            mFileOutputStream.close(); //don't forget to close

    //            vCard.add(storage_path); //CHANGE: not needed           

        } catch (Exception e1)  {            
            e1.printStackTrace();
        }
    }       

    private void data() {     
    //        File filelocation = file; //CHANGE: not what we need    
        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        sharingIntent.setType("vnd.android.cursor.dir/email");      
        sharingIntent.setType("application/x-vcard"); 
        //CHANGE: using correct path:
        sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(storage_path));
        startActivity(Intent.createChooser(sharingIntent, "Send email"));            
    }

}