2012-10-09 8 views
8

W mojej aplikacji liczba kontaktów jest dołączona do pojedynczego pliku .vcf, a ten plik wysłany na pocztę, spróbuj wyświetlić wszystkie dane kontaktów w log cat, ale nie można wysłać wszystkich danych dołączonych do pojedynczego pliku .vcf ?Android, jak wysłać wiele kontaktów jest załączony w jednym pliku .vcf i wysłać na e-mail?

Każdy ma pomysł dotyczący tej pomocy, proszę.

tutaj jest mój kod

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

Odpowiedz

6

wreszcie mój problem został rozwiązany przy użyciu jak to

 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

Nie widzę, gdzie zainicjowałeś 'filedata'. – BBdev

+0

@BBdev zobacz niedopasowanie małego kodu edycji. – NagarjunaReddy

+0

po prostu natknąłem się na to, więc dostałem tutaj, że naprawiłem mój problem, ale pomyślałem o innych, że warto ci to powiedzieć :). Tylko dla przyszłej reakcji. Dzięki – BBdev

2

pomyślnie przetestowany, co następuje. Zmiany w kodzie są oznaczone komentarzami zaczynającymi się od "ZMIEŃ:". Pamiętaj, aby w swoim manifeście mieć 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"));    
    } 

} 
+0

nie działa wysyłanie pliku poczty elektronicznej jest 0k tylko Dzięki za odpowiedź mój problem jest rozwiązany aktualizowana moja odpowiedź wkrótce ..... – NagarjunaReddy

+0

Moje rozwiązanie działa dla mnie - po uruchomieniu pojawia się monit z listą aplikacji, których można użyć do wysłania pliku .vcf, a gdy wybiorę jedną z aplikacji na liście, dołączony jest plik .vcf o rozmiarze 40 KB. wiadomość. Pomyślnie wysłałem plik do siebie i potwierdziłem, że są w nim moje kontakty. Cieszę się, że masz rozwiązanie, choć przykro mi, że moje nie działało dla ciebie. Jestem ciekaw, gdzie moje rozwiązanie się nie powiodło, jeśli podasz szczegóły. Dzięki. – hBrent

+0

zobacz przestarzałą odpowiedź: działa dobrze ... – NagarjunaReddy

Powiązane problemy