2012-10-09 15 views
8

In meiner Anwendung sind eine Reihe von Kontakten an einzelne .vcf Datei und diese Datei an Mail gesendet, versuchen Sie, diese alle Kontakte Datenanzeige in Protokoll cat, aber nicht alle Daten an einzelne .vcf-Datei angefügt senden können ?Android, wie Sie mehrere Kontakte senden, sind in einzelnen .vcf-Datei angehängt und an Mail senden?

Jeder hat eine Idee in Bezug auf diese Hilfe, bitte.

hier ist mein Code

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

Antwort

6

endlich mein Problem gelöst wird mit ähnlichen

 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, "[email protected]");   
    sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+filelocation.getAbsolutePath())); 
    startActivity(Intent.createChooser(sharingIntent, "Send email"));    
} 
+0

ich sehe nicht, wo Sie 'filedata' initialisiert haben. – BBdev

+0

@BBdev siehe Bearbeitungscode kleine Abweichung. – NagarjunaReddy

+0

Ich war gerade darüber gestolpert, so dass ich hier war, hatte ich mein Problem behoben, aber gedacht für einige andere wäre es nützlich, Ihnen zu sagen :). Nur für die zukünftige Antwort. Danke – BBdev

2

ich folgendes erfolgreich getestet. Änderungen an Ihrem Code werden mit Kommentaren angezeigt, die mit "CHANGE:" beginnen. Vergessen Sie nicht, android.permission.WRITE_EXTERNAL_STORAGE in Ihrem Manifest zu haben.

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

} 
+0

es nicht funktioniert Mail-Datei ist 0k nur Danke für Antwort meines Problem gelöst wird aktualisiert meine Antwort bald ..... – NagarjunaReddy

+0

Meine Lösung senden funktioniert für mich - wenn ich es ausführe, werde ich mit einer Liste von Apps aufgefordert, um die .vcf Datei zu mailen, und wenn ich eine der Anwendungen in der Liste auswähle, wird eine 40 KB .vcf Datei an die neue angehängt Botschaft. Ich habe die Datei erfolgreich an mich selbst gesendet und bestätigt, dass meine Kontakte darin waren. Freut mich, dass Sie eine Lösung haben, obwohl es mir leid tut, dass ich nicht für Sie gearbeitet habe. Ich bin neugierig zu wissen, wo meine Lösung fehlgeschlagen ist, wenn Sie Details angeben würden. Vielen Dank. – hBrent

+0

siehe datiert antwort es funktioniert gut .... – NagarjunaReddy