Reputation: 703
In my Android, I am reading the contacts by using content resolver.But content resolver is not getting initialized ,it gives NullPointerException
.
I want to use the string arrays in another class and to get values in them I have to query the database and read contacts from phone,but stuck with that exception as pointed out in code:
//this code is in some other class...
et= (EditText) findViewById(R.id.searchcontact);
et.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int
count) { // TODO Auto-generated method stub
lva.getFilter().filter(s);
RefreshListView rlv=new RefreshListView();<----class is getting called from here
lva.notifyDataSetInvalidated();
lva = new ListViewAdapterContacts(AllContactsActivity.this, rlv.names, rlv.types, rlv.phones, rlv.ids);
lv.setAdapter(lva);
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) { // TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
// lva.notifyDataSetChanged();
}
});
...............********.........
public class RefreshListView extends ListActivity{
String[] names,phones,types,ids;
String name,id,phoneNumber;
int type;
ArrayList <String> newValues;
public void onCreate(Bundle b){
super.onCreate(b);
newValues=SetNewList.getNames();
getContacts();
}
public void getContacts(){
int foo = 0;
ContentResolver cr = getContentResolver();<---//null pointer exception
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
+ ") ASC");
if (cur.getCount() > 0) {
names = new String[cur.getCount()];
phones = new String[cur.getCount()];
types = new String[cur.getCount()];
ids = new String[cur.getCount()];
while (cur.moveToNext()) {
name = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
for(int i=0;i<=newValues.size();i++){
if(newValues.get(i).equalsIgnoreCase(name)) {
id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
String hasPhone = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (Integer.parseInt(hasPhone) == 1) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + id, null, null);
while (phones.moveToNext()) {
phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
} // while
phones.close();
}// if
else {
phoneNumber = "unknown";
type = 0;
}// else
phones[foo] = phoneNumber;
names[foo] = name;
ids[foo] = id;
if (type == 0) {
String value = "unknown";
types[foo] = value;
}
else if (type == 1) {
String value = "home";
types[foo] = value;
}// if
else if (type == 2) {
String value = "mobile";
types[foo] = value;
}// else if
else if (type == 3) {
String value = "Work";
types[foo] = value;
}
else if (type == 4) {
String value = "Workfax";
types[foo] = value;
}
else if (type == 5) {
String value = "Home Fax";
types[foo] = value;
} else if (type == 6) {
String value = "Pager";
types[foo] = value;
}
else {
String value = "Other";
types[foo] = value;
}
foo++;
}
}
}// while
}// if
}// get contacts
}
Upvotes: 4
Views: 5512
Reputation: 31463
getContentResolver() should be called inside an implementation of Activity - try overriding onCreate(). It's clearer if you call it as this.getContentResolver()
in your activity = easier to read.
Check out this example code (after "Binding to Data" section).
You can use ContentResolver in every other application component, you just need a Context. In the case of Activity, you automatically use the Activity's context. You can also use the Application Context - they basically differ in their lifecycles.
Upvotes: 1
Reputation: 48871
Don't do this...
public class RefreshListView extends ListActivity{
public RefreshListView() {
...
}
}
Do not use a constructor for an Android Activity
!!!
You should remove that constructor and put the code into the Activity
onCreate(...)
method.
See the documentation for Activity and also read Activities.
Try something like this...
public class RefreshListView extends ListActivity{
String[] names,phones,types,ids;
String name,id,phoneNumber;
int type;
ArrayList <String> newValues;
ContentResolver cr = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cr = getContentResolver();
newValues=SetNewList.getNames();//getnames is of static type
getContacts();
}
public void getContacts() {
int foo = 0;
// REMOVE THE NEXT LINE !!!
// ContentResolver cr = getContentResolver();
...
}
}
Upvotes: 2