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

在我的应用程序中,有多个联系人附加到单个.vcf文件,并将该文件发送到邮件,试图将这一个联系人的所有数据显示在日志猫中,但无法发送附加到单个.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")); } } 

Solutions Collecting From Web of "Android如何发送多个联系人附加在单个.vcf文件并发送到邮件?"

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

  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")); } 

我成功testing了以下内容。 您的代码更改以“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")); } }