2013-04-25 2 views
0
package in.wptrafficanalzer.listviewcontacts; 

import java.io.File; 
import java.io.FileOutputStream; 

import android.app.Activity; 
import android.database.Cursor; 
import android.database.MatrixCursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.Menu; 
import android.widget.ListView; 

public class MainActivity extends Activity { 

SimpleCursorAdapter mAdapter; 
MatrixCursor mMatrixCursor; 
Cursor contactsCursor; 
Cursor dataCursor; 

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

    // The contacts from the contacts content provider is stored in this cursor 
    mMatrixCursor = new MatrixCursor(new String[] { "_id","name","photo","details"}); 

    // Adapter to set data in the listview 
    mAdapter = new SimpleCursorAdapter(getBaseContext(), 
      R.layout.lv_layout, 
      null, 
      new String[] { "name","photo","details"}, 
      new int[] { R.id.tv_name,R.id.iv_photo,R.id.tv_details}, 0); 

    // Getting reference to listview 
    ListView lstContacts = (ListView) findViewById(R.id.lst_contacts); 

    // Setting the adapter to listview 
    lstContacts.setAdapter(mAdapter);   

    // Creating an AsyncTask object to retrieve and load listview with contacts 
    ListViewContactsLoader listViewContactsLoader = new ListViewContactsLoader(); 

    // Starting the AsyncTask process to retrieve and load listview with contacts 
    listViewContactsLoader.execute();   

}  

/** An AsyncTask class to retrieve and load listview with contacts */ 
private class ListViewContactsLoader extends AsyncTask<Void, Void, Cursor>{  

    @Override 
    protected Cursor doInBackground(Void... params) { 
     Uri contactsUri = ContactsContract.Contacts.CONTENT_URI; 

     // Querying the table ContactsContract.Contacts to retrieve all the contacts 
     contactsCursor = getContentResolver().query(contactsUri, null, null, null, 
           ContactsContract.Contacts.DISPLAY_NAME + " ASC "); 

     if(contactsCursor.moveToFirst()){ 
      do{ 
       long contactId = contactsCursor.getLong(contactsCursor.getColumnIndex("_ID")); 


       Uri dataUri = ContactsContract.Data.CONTENT_URI; 

       // Querying the table ContactsContract.Data to retrieve individual items like 
       // home phone, mobile phone, work email etc corresponding to each contact 
       dataCursor = getContentResolver().query(dataUri, null, 
             ContactsContract.Data.CONTACT_ID + "=" + contactId, 
             null, null); 


       String displayName=""; 
       String nickName=""; 
       String homePhone=""; 
       String mobilePhone=""; 
       String workPhone=""; 
       String photoPath="" + R.drawable.blank; 
       byte[] photoByte=null; 
       String homeEmail=""; 
       String workEmail=""; 
       String companyName=""; 
       String title=""; 



       if(dataCursor.moveToFirst()){ 
        // Getting Display Name 
        displayName = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
        do{ 

         // Getting NickName 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE)) 
          nickName = dataCursor.getString(dataCursor.getColumnIndex("data1")); 

         // Getting Phone numbers 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)){ 
          switch(dataCursor.getInt(dataCursor.getColumnIndex("data2"))){ 
           case ContactsContract.CommonDataKinds.Phone.TYPE_HOME : 
            homePhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
           case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE : 
            mobilePhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
           case ContactsContract.CommonDataKinds.Phone.TYPE_WORK : 
            workPhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
          } 
         } 

         // Getting EMails 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {          
          switch(dataCursor.getInt(dataCursor.getColumnIndex("data2"))){ 
           case ContactsContract.CommonDataKinds.Email.TYPE_HOME : 
            homeEmail = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
           case ContactsContract.CommonDataKinds.Email.TYPE_WORK : 
            workEmail = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break;          
          } 
         } 

         // Getting Organization details 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)){ 
          companyName = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
          title = dataCursor.getString(dataCursor.getColumnIndex("data4")); 
         } 

         // Getting Photo  
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)){        
          photoByte = dataCursor.getBlob(dataCursor.getColumnIndex("data15")); 

          if(photoByte != null) {       
           Bitmap bitmap = BitmapFactory.decodeByteArray(photoByte, 0, photoByte.length); 

           // Getting Caching directory 
           File cacheDirectory = getBaseContext().getCacheDir(); 

           // Temporary file to store the contact image 
           File tmpFile = new File(cacheDirectory.getPath() + "/wpta_"+contactId+".png"); 

           // The FileOutputStream to the temporary file 
           try { 
            FileOutputStream fOutStream = new FileOutputStream(tmpFile); 

            // Writing the bitmap to the temporary file as png file 
            bitmap.compress(Bitmap.CompressFormat.PNG,100, fOutStream); 

            // Flush the FileOutputStream 
            fOutStream.flush(); 

            //Close the FileOutputStream 
            fOutStream.close(); 

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

           photoPath = tmpFile.getPath(); 
          } 

         } 

        }while(dataCursor.moveToNext());      

        String details = ""; 

        // Concatenating various information to single string 
        if(homePhone != null && !homePhone.equals("")) 
         details = "HomePhone : " + homePhone + "\n"; 
        if(mobilePhone != null && !mobilePhone.equals("")) 
         details += "MobilePhone : " + mobilePhone + "\n"; 
        if(workPhone != null && !workPhone.equals("")) 
         details += "WorkPhone : " + workPhone + "\n"; 
        if(nickName != null && !nickName.equals("")) 
         details += "NickName : " + nickName + "\n"; 
        if(homeEmail != null && !homeEmail.equals("")) 
         details += "HomeEmail : " + homeEmail + "\n"; 
        if(workEmail != null && !workEmail.equals("")) 
         details += "WorkEmail : " + workEmail + "\n"; 
        if(companyName != null && !companyName.equals("")) 
         details += "CompanyName : " + companyName + "\n"; 
        if(title != null && !title.equals("")) 
         details += "Title : " + title + "\n"; 

        // Adding id, display name, path to photo and other details to cursor 
        mMatrixCursor.addRow(new Object[]{ Long.toString(contactId),displayName,photoPath,details}); 
       } 

      }while(contactsCursor.moveToNext()); 
     } 
     return mMatrixCursor; 
    } 

    @Override 
    protected void onPostExecute(Cursor result) {   
     // Setting the cursor containing contacts to listview 
     mAdapter.swapCursor(result); 
    }  
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 
} 

Я пытаюсь загрузить это в свою камеру .. он висит в течение нескольких минут и усиливает закрытие. Ошибка Я получил следующее: почему так сложно работать с андроидными контактами.Я пытаюсь загрузить контакты в свой телефон .. код работает нормально в эмуляторе, но сбой в телефоне

FATAL EXCEPTION: AsyncTask #1 
java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:200) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
at java.lang.Thread.run(Thread.java:1096) 
Caused by: java.lang.NullPointerException 
at in.wptrafficanalzer.listviewcontacts.MainActivity$ListViewContactsLoader.doInBackground(MainActivity.java:92) 
at in.wptrafficanalzer.listviewcontacts.MainActivity$ListViewContactsLoader.doInBackground(MainActivity.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:185) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    … 4 more 

Похоже, есть что-то делать в doinbackgroung method..unsure хотя ..

+0

Что такое строка 92 вашего кода? Вы получаете нулевую указатель где-то на этой строке. 'Причиненный: java.lang.NullPointerException at in.wptrafficanalzer.listviewcontacts.MainActivity $ ListViewContactsLoader.doInBackground (MainActivity.java:92)' – loeschg

+0

Привет, Спасибо за ответ. – AlexMiller

+0

if (dataCursor.moveToFirst()) { // Получение отображаемого имени displayName = dataCursor.getString (dataCursor.getColumnIndex (ContactsContract.Data.DISPLAY_NAME)); do { – AlexMiller

ответ

0

Вы должны закрыть dataCursor и contactsCursor в конце метода doInBackground. Таким образом, ваш код выглядит так:

@Override 
    protected Cursor doInBackground(Void... params) { 
     Uri contactsUri = ContactsContract.Contacts.CONTENT_URI; 

     // Querying the table ContactsContract.Contacts to retrieve all the contacts 
     contactsCursor = getContentResolver().query(contactsUri, null, null, null, 
           ContactsContract.Contacts.DISPLAY_NAME + " ASC "); 

     if(contactsCursor.moveToFirst()){ 
      do{ 
       long contactId = contactsCursor.getLong(contactsCursor.getColumnIndex("_ID")); 


       Uri dataUri = ContactsContract.Data.CONTENT_URI; 

       // Querying the table ContactsContract.Data to retrieve individual items like 
       // home phone, mobile phone, work email etc corresponding to each contact 
       dataCursor = getContentResolver().query(dataUri, null, 
             ContactsContract.Data.CONTACT_ID + "=" + contactId, 
             null, null); 


       String displayName=""; 
       String nickName=""; 
       String homePhone=""; 
       String mobilePhone=""; 
       String workPhone=""; 
       String photoPath="" + R.drawable.blank; 
       byte[] photoByte=null; 
       String homeEmail=""; 
       String workEmail=""; 
       String companyName=""; 
       String title=""; 



       if(dataCursor.moveToFirst()){ 
        // Getting Display Name 
        displayName = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
        do{ 

         // Getting NickName 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE)) 
          nickName = dataCursor.getString(dataCursor.getColumnIndex("data1")); 

         // Getting Phone numbers 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)){ 
          switch(dataCursor.getInt(dataCursor.getColumnIndex("data2"))){ 
           case ContactsContract.CommonDataKinds.Phone.TYPE_HOME : 
            homePhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
           case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE : 
            mobilePhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
           case ContactsContract.CommonDataKinds.Phone.TYPE_WORK : 
            workPhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
          } 
         } 

         // Getting EMails 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {          
          switch(dataCursor.getInt(dataCursor.getColumnIndex("data2"))){ 
           case ContactsContract.CommonDataKinds.Email.TYPE_HOME : 
            homeEmail = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break; 
           case ContactsContract.CommonDataKinds.Email.TYPE_WORK : 
            workEmail = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
            break;          
          } 
         } 

         // Getting Organization details 
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)){ 
          companyName = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
          title = dataCursor.getString(dataCursor.getColumnIndex("data4")); 
         } 

         // Getting Photo  
         if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)){        
          photoByte = dataCursor.getBlob(dataCursor.getColumnIndex("data15")); 

          if(photoByte != null) {       
           Bitmap bitmap = BitmapFactory.decodeByteArray(photoByte, 0, photoByte.length); 

           // Getting Caching directory 
           File cacheDirectory = getBaseContext().getCacheDir(); 

           // Temporary file to store the contact image 
           File tmpFile = new File(cacheDirectory.getPath() + "/wpta_"+contactId+".png"); 

           // The FileOutputStream to the temporary file 
           try { 
            FileOutputStream fOutStream = new FileOutputStream(tmpFile); 

            // Writing the bitmap to the temporary file as png file 
            bitmap.compress(Bitmap.CompressFormat.PNG,100, fOutStream); 

            // Flush the FileOutputStream 
            fOutStream.flush(); 

            //Close the FileOutputStream 
            fOutStream.close(); 

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

           photoPath = tmpFile.getPath(); 
          } 

         } 

        }while(dataCursor.moveToNext());      

        String details = ""; 

        // Concatenating various information to single string 
        if(homePhone != null && !homePhone.equals("")) 
         details = "HomePhone : " + homePhone + "\n"; 
        if(mobilePhone != null && !mobilePhone.equals("")) 
         details += "MobilePhone : " + mobilePhone + "\n"; 
        if(workPhone != null && !workPhone.equals("")) 
         details += "WorkPhone : " + workPhone + "\n"; 
        if(nickName != null && !nickName.equals("")) 
         details += "NickName : " + nickName + "\n"; 
        if(homeEmail != null && !homeEmail.equals("")) 
         details += "HomeEmail : " + homeEmail + "\n"; 
        if(workEmail != null && !workEmail.equals("")) 
         details += "WorkEmail : " + workEmail + "\n"; 
        if(companyName != null && !companyName.equals("")) 
         details += "CompanyName : " + companyName + "\n"; 
        if(title != null && !title.equals("")) 
         details += "Title : " + title + "\n"; 

        // Adding id, display name, path to photo and other details to cursor 
        mMatrixCursor.addRow(new Object[]{ Long.toString(contactId),displayName,photoPath,details}); 
       } 

        dataCursor.close();  // Closing dataCursor 

      }while(contactsCursor.moveToNext()); 

      contactsCursor.close();   // Closing contactsCursor 

     } 
     return mMatrixCursor; 
    } 
+0

Спасибо, что сработал! – AlexMiller

Смежные вопросы