2015-09-27 4 views
-1

это программа, вызывающая класс getDetails. когда он вызывает getDetails, он получил эту ошибку. Я пробовал getDetails код sepretaly, и он работает. но когда я называю это из этого класса, он показывает мне эту ошибку. я загрузить изображение ошибки здесь: null указатель ошибка исключения eclipse

Это кажется связано с этой линии:

Cursor names = context.getContentResolver().query(uri, projection, null, null, null); 

код

public class SmsFilter extends BroadcastReceiver { 
SharedPreferences preferences = null ; 
    Context context = null; 


@Override 
public void onReceive(Context context, Intent intent) { 



    preferences = context.getSharedPreferences("modes",Context.MODE_PRIVATE); 


    if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 

     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      Object[] pdus = (Object[])extras.get("pdus"); 

      if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible. 

      StringBuilder sb = new StringBuilder(); 
      String sender = null; 
      for (int i = 0; i < pdus.length; i++) { 
       SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       if (sender == null) sender = message.getOriginatingAddress(); 
       String text = message.getMessageBody(); 
       if (text != null) sb.append(text); 
      } 
      if (preferences.getBoolean("enable", true)==false) { 



      if (preferences.getBoolean("all", true)){ abortBroadcast();} 



      else if (preferences.getBoolean("blacklist", true)){ 

      boolean str=Search.search(sender); 

       if (sender != null && str ==true) { 


       abortBroadcast(); 

      } 

      } 
      else if (preferences.getBoolean("contact", true)&& getDetails(sender)){ 
       abortBroadcast(); 


      } 






      else {}} 


      return; 
     } 
    } 

    // ... 
} 


boolean getDetails(String Phonumber){ 
    Boolean answer=null; 

    Log.i("sss", "to here"); 


Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    // ContentResolver cr = getContentResolver(); 


// Cursor cur = context.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
        ContactsContract.CommonDataKinds.Phone.NUMBER }; 



Log.i("sss", "to here1"); 



Cursor names = context.getContentResolver().query(uri, projection, null, null, null); 



//int indexName = names.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
int indexNumber = names.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
Log.i("sss", "to here n"+indexNumber); 


names.moveToFirst(); 
do { 

    Log.i("sss", names.getString(indexNumber)); 

     String number = names.getString(indexNumber); 

    number.replace(" ", ""); 
    if(number.startsWith("0")){ 
     number="+98"+context.getString(1,number.length());} 

    if(Phonumber.startsWith("0")){ 
    Phonumber="+98"+Phonumber.substring(1,Phonumber.length());} 



    if (number.equals(Phonumber)) 

    {answer=true;} 

} while (names.moveToNext()); 
return answer; 
} 

} 
+0

Вы можете очистить в отчете об ошибке ... ошибка сказать NPE на blocker.activity.contactsearch.search (contactsearch.java:37), поэтому я чувствую, что ошибка находится в строке -> boolean str = Search.search (отправитель); в качестве альтернативы вы можете щелкнуть по этой строке в отчете, и это приведет вас к месту назначения –

ответ

1

Вы заявили член в верхней части вашего класса, но никогда не назначать действительную ссылку на него:

Context context = null; 

Как удалось ч, context еще null, когда вы звоните:

Cursor names = context.getContentResolver().query(uri, projection, null, null, null); 

Следовательно, NullPointerException.

Вариант 1
Убедитесь, что вы либо либо назначить действительную ссылку (в onReceive()):

this.context = context; 

Вариант 2
Или пройти по ссылке в качестве параметра метода для getDetails():

else if (preferences.getBoolean("contact", true) && getDetails(context, sender)) { ... } 

Метод itse ЛФ будет выглядеть следующим образом:

boolean getDetails(Context context, String Phonumber) { ... } 

Если вы используете второй вариант, вы можете удалить строку, которая говорит Context context = null;, как это уже не используется. Ваша IDE может уже намекнуть на это (я знаю, что Android Studio определенно делает, но не уверен в Eclipse).

+0

префект !!!!!!!!!! –

+0

@sarasara: Тогда почему неприемлемо? –

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