2011-07-29 9 views
2

我想從手機中獲取聯繫人姓名和相應的聯繫電話號碼,並且希望將其寫入.csv文件中。每行將包含整個聯繫人列表中每個人的聯繫人姓名和聯繫人號碼。如何在.csv文件中編寫聯繫人信息?如何在Android中的.csv文件中編寫contactname和contactno row-wise?

我寫的顯示contactname列的代碼,但它只顯示一個聯繫人意味着它與現有的重寫,所以更改新的聯繫人名稱的行應該是什麼竅門。

我的代碼

 public class contactlist extends Activity { 
    static String name; 
    static int count; 
    static int countno; 
    static File file = null ; 

    /** Called when the activity is first created. */ 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button filterbtn = (Button)findViewById(R.id.button1); 
    filterbtn.setOnClickListener(new View.OnClickListener() 
    { 
    public void onClick(View v) 
    { 


     Uri u1 = Uri.fromFile(file); 
     Intent sendIntent = new Intent(Intent.ACTION_SEND); 
     sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Person Details"); 
     sendIntent.putExtra(Intent.EXTRA_STREAM, u1); 
     sendIntent.setType("text/html"); 
     startActivity(sendIntent); 


     } 
    }); 

    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      null, null, null, null); 
    if (cur.getCount() > 0) { 
    while (cur.moveToNext()) { 
     String id = cur.getString(
        cur.getColumnIndex(ContactsContract.Contacts._ID)); 

      name = cur.getString(
         cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 





      String columnString = "\"PersonName\",\"phoneno\""; 
     String dataString = null; 

我只用名字和 「PHONENO」 是固定的。但在.csv文件中只有一個聯繫人顯示

  dataString = "\"" + name +"\",\"" + "phoneno" + "\"";  


     String combinedString = columnString + "\n" + dataString; 

     File root = Environment.getExternalStorageDirectory(); 
     if (root.canWrite()){ 
      File dir = new File (root.getAbsolutePath() + "/PersonData"); 
       dir.mkdirs(); 
       file = new File(dir, "Data.csv"); 
       FileOutputStream out = null; 
      try { 
       out = new FileOutputStream(file); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 
       try { 
        out.write(combinedString.getBytes()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       try { 
        out.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 



     } 



} 
    cur.close(); 
} 
+0

哪裏是代碼來獲取聯繫人姓名和電話號碼,並創建CSV? –

+0

嗨pankaj我編輯了我的上面的代碼..實際上我沒有太多的想法如何做到這一點..我現在只提取聯繫人名稱進行測試..means顯示聯繫人名稱下面的「聯繫人名稱」列..i硬編碼「phoneno」字段,所以請你能告訴我如何做到這一點..如果你有任何其他的概念,您最歡迎感謝... –

+0

我使用字符串combinedString = columnString +「\ n」+ dataString;用於在列字符串下方添加行,但它總是替換列名下面的現有行,以便如何添加第一行後其他..謝謝先生,如果你可以提供我任何代碼,我將非常感謝你... –

回答

2

編輯

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.ContactsContract; 
import android.provider.ContactsContract.CommonDataKinds.Phone; 
import android.util.Log; 
import android.widget.Toast; 

/** 
* @author Pankaj 
* 
*/ 
public class CsvSender extends Activity { 

    private Cursor cursor; 
    private boolean csv_status = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     createCSV(); 
     exportCSV(); 

    } 

    private void createCSV() { 
     CSVWriter writer = null; 
     try { 
      writer = new CSVWriter(new FileWriter(Environment.getExternalStorageDirectory().getAbsolutePath() + "/my_test_contact.csv")); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     String displayName; 
     String number; 
     long _id; 
     String columns[] = new String[]{ ContactsContract.Contacts._ID, 
        ContactsContract.Contacts.DISPLAY_NAME }; 
     writer.writeColumnNames(); // Write column header 
     Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, 
        columns,     
        null,    
        null,    
        ContactsContract.Data.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
     startManagingCursor(cursor); 
     if(cursor.moveToFirst()) { 
      do { 
       _id = Long.parseLong(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))); 
       displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)).trim(); 
       number = getPrimaryNumber(_id); 
       writer.writeNext((displayName + "/" + number).split("/")); 
      } while(cursor.moveToNext()); 
      csv_status = true; 
     } else { 
      csv_status = false; 
     } 
     try { 
      if(writer != null) 
       writer.close(); 
     } catch (IOException e) { 
      Log.w("Test", e.toString()); 
     } 

    }// Method close. 


    private void exportCSV() { 
     if(csv_status == true) { 
      //CSV file is created so we need to Export that ... 
      final File CSVFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/my_test_contact.csv"); 
      //Log.i("SEND EMAIL TESTING", "Email sending"); 
      Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
      emailIntent.setType("text/csv"); 
      emailIntent .putExtra(android.content.Intent.EXTRA_SUBJECT, "Test contacts ");   
      emailIntent .putExtra(android.content.Intent.EXTRA_TEXT, "\n\nAdroid developer\n Pankaj"); 
      emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + CSVFile.getAbsolutePath())); 
      emailIntent.setType("message/rfc822"); // Shows all application that supports SEND activity 
      try { 
       startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
      } catch (android.content.ActivityNotFoundException ex) { 
       Toast.makeText(getApplicationContext(), "Email client : " + ex.toString(), Toast.LENGTH_SHORT); 
      } 
     } else { 
      Toast.makeText(getApplicationContext(), "Information not available to create CSV.", Toast.LENGTH_SHORT).show(); 
     } 
    } 
     /** 
     * Get primary Number of requested id. 
     * 
     * @return string value of primary number. 
     */ 
     private String getPrimaryNumber(long _id) { 
      String primaryNumber = null; 
      try { 
       Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         new String[]{Phone.NUMBER, Phone.TYPE}, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ _id, // We need to add more selection for phone type 
         null, 
         null); 
       if(cursor != null) { 
        while(cursor.moveToNext()){ 
         switch(cursor.getInt(cursor.getColumnIndex(Phone.TYPE))){ 
          case Phone.TYPE_MOBILE : 
           primaryNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER)); 
           break; 
          case Phone.TYPE_HOME : 
           primaryNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER)); 
           break; 
          case Phone.TYPE_WORK : 
           primaryNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER)); 
           break; 
          case Phone.TYPE_OTHER : 
         } 
         if(primaryNumber != null) 
          break; 
        } 
       }  
      } catch (Exception e) { 
       Log.i("test", "Exception " + e.toString()); 
      } finally { 
       if(cursor != null) { 
        cursor.deactivate(); 
        cursor.close();    
       } 
      } 
      return primaryNumber; 
     } 
} 

這裏是CSVWriter類

import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.Writer; 

/** 
* @author Pankaj 
* 
*/ 
public class CSVWriter { 

    private PrintWriter pw; 
    private char separator; 
    private char quotechar; 
    private char escapechar; 
    private String lineEnd; 

    /** The character used for escaping quotes. */ 
    public static final char DEFAULT_ESCAPE_CHARACTER = '"'; 

    /** The default separator to use if none is supplied to the constructor. */ 
    public static final char DEFAULT_SEPARATOR = ','; 

    /** 
    * The default quote character to use if none is supplied to the 
    * constructor. 
    */ 
    public static final char DEFAULT_QUOTE_CHARACTER = '"'; 

    /** The quote constant to use when you wish to suppress all quoting. */ 
    public static final char NO_QUOTE_CHARACTER = '\u0000'; 

    /** The escape constant to use when you wish to suppress all escaping. */ 
    public static final char NO_ESCAPE_CHARACTER = '\u0000'; 

    /** Default line terminator uses platform encoding. */ 
    public static final String DEFAULT_LINE_END = "\n"; 

    /** Default column name. */ 
    public static final String DEFAULT_COLUMN_NAME = "Contact Name,Phone Number,"; 

    /** 
    * Constructs CSVWriter using a comma for the separator. 
    * 
    * @param writer 
    *   the writer to an underlying CSV source. 
    */ 
    public CSVWriter(Writer writer) { 
     this(writer, DEFAULT_SEPARATOR, DEFAULT_QUOTE_CHARACTER, 
      DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END); 
    } 

    /** 
    * Constructs CSVWriter with supplied separator, quote char, escape char and line ending. 
    * 
    * @param writer 
    *   the writer to an underlying CSV source. 
    * @param separator 
    *   the delimiter to use for separating entries 
    * @param quotechar 
    *   the character to use for quoted elements 
    * @param escapechar 
    *   the character to use for escaping quotechars or escapechars 
    * @param lineEnd 
    *     the line feed terminator to use 
    */ 
    public CSVWriter(Writer writer, char separator, char quotechar, char escapechar, String lineEnd) { 
     this.pw = new PrintWriter(writer); 
     this.separator = separator; 
     this.quotechar = quotechar; 
     this.escapechar = escapechar; 
     this.lineEnd = lineEnd; 
    } 

    /** 
    * Writes the next line to the file. 
    * 
    * @param nextLine 
    *   a string array with each comma-separated element as a separate 
    *   entry. 
    */ 
    public void writeNext(String[] nextLine) { 

     if (nextLine == null) 
       return; 

     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < nextLine.length; i++) { 

      if (i != 0) { 
       sb.append(separator); 
      } 

      String nextElement = nextLine[i]; 
      if (nextElement == null) 
       continue; 
      if (quotechar != NO_QUOTE_CHARACTER) 
       sb.append(quotechar); 
      for (int j = 0; j < nextElement.length(); j++) { 
       char nextChar = nextElement.charAt(j); 
       if (escapechar != NO_ESCAPE_CHARACTER && nextChar == quotechar) { 
         sb.append(escapechar).append(nextChar); 
       } else if (escapechar != NO_ESCAPE_CHARACTER && nextChar == escapechar) { 
         sb.append(escapechar).append(nextChar); 
       } else { 
        sb.append(nextChar); 
       } 
      } 
      if (quotechar != NO_QUOTE_CHARACTER) 
       sb.append(quotechar); 
     } 

     sb.append(lineEnd); 
     pw.write(sb.toString()); 

    } 

    public void writeColumnNames() { 
     writeNext(DEFAULT_COLUMN_NAME.split(",")); 
    } 

    /** 
    * Flush underlying stream to writer. 
    * 
    * @throws IOException if bad things happen 
    */ 
    public void flush() throws IOException { 
     pw.flush(); 
    } 

    /** 
    * Close the underlying stream writer flushing any buffered content. 
    * 
    * @throws IOException if bad things happen 
    * 
    */ 
    public void close() throws IOException { 
     pw.flush(); 
     pw.close(); 
    } 

} 

並添加權限,表現爲

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

vv thanks for responce.its force close on writer.writeColumnNames();在csvsender.java中,錯誤是07-29 12:34:41.760:ERROR/AndroidRuntime(853):引起:java.lang.NullPointerException 07-29 12:34 :41.760:ERROR/AndroidRuntime(853):at contactlist.pkg.contactlist.createCSV(contactlist.java:47) 07-29 12:34:41.760:ERROR/AndroidRuntime(853):at contactlist.pkg.contactlist.onCreate (contactlist.java:30) –

+0

給我點時間 –

+0

我的代碼正在運行。說說你的contactlist.java類中的第47行是什麼。 –