我正在尝试在手机中加载联系人.代码在模拟器中工作良好,但在手机中崩溃


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

我试着加载这个在我的单元格..它挂了几分钟,强行关闭..我收到的错误如下…为什么用android通讯录这么难?

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 

看起来在doinbackground方法中有一些事情要做,但不确定…

你必须在doInBackground方法结束时关闭dataCursor和contactsCursor。所以你的代码看起来像这样:

@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;
    }

最新更新