2016-03-28 81 views
1

今天我建立新的应用程序添加联系人,但我在日志猫错误是这样的:致命异常:螺纹128显示java.lang.NullPointerException

主题ID = 11:螺纹,未捕获的异常退出(组= 0xa4ca6b20)

致命异常:线程128

过程:kr.co.composer.callrecord,PID:5275 显示java.lang.NullPointerException

在android.content.ContextW rapper.getContentResolver(ContextWrapper.java:99)

在kr.co.composer.callrecord.page.AddContactActivity.insertContact(AddContactActivity.java:116)

在kr.co.composer.callrecord.callbroadcast。 CallBroadcast $ 1.run(CallBroadcast.java:110)

在java.lang.Thread.run(Thread.java:841)

我觉得问题在行insertContact类:

ContentResolver contentResolver = this.getContentResolver();

检查所有更多的代码,这个类我从AppCompatActivity延伸:

public boolean insertContact(String firstName, String mobileNumber, String addressCall, String timeStart, String currentDate) { 
    ContentResolver contentResolver = this.getContentResolver(); 
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

    ops.add(ContentProviderOperation 
      .newInsert(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) 
      .build()); 
    ops.add(ContentProviderOperation 
      .newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, firstName + " " + timeStart + " " + currentDate).build()); 
    ops.add(ContentProviderOperation 
      .newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, mobileNumber) 
      .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).build()); 
    ops.add(ContentProviderOperation 
      .newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 
        0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, addressCall).build()); 
    try { 
     contentResolver.applyBatch(ContactsContract.AUTHORITY, ops); 
    } catch (Exception e) { 
     return false; 
    } 
    return true; 
} 

毕竟,在CallBroadcast我所说的这个类的所有参数的(我插入值不为空)。

InputStream answerInputStream = connection.getInputStream(); 
final String answer = getTextFromInputStream(answerInputStream); 

if(answer!="") { 
    String[] contactInfo = answer.split(":::::"); 

    contact.insertContact(contactInfo[0], contactInfo[1], contactInfo[2], contactInfo[3], contactInfo[4]); 
} 

answer价值观是:

Alisan:::::".$text.":::::10p.m at Yusski street:::::25/03/2015:::::28/03/2015

class CallBroadcast extends BroadcastReceiver我打电话insertContact方法。您可以在波纹管看到更多的代码:

public class CallBroadcast extends BroadcastReceiver { 
    public void sendToServer(final String text){ 
     contact = new AddContactActivity(); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 

        String textparam = "text1=" + URLEncoder.encode(text, "UTF-8"); 

        URL scripturl = new URL(scripturlstring); 
        HttpURLConnection connection = (HttpURLConnection) scripturl.openConnection(); 
        connection.setDoOutput(true); 
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
        connection.setFixedLengthStreamingMode(textparam.getBytes().length); 
        OutputStreamWriter contentWriter = new OutputStreamWriter(connection.getOutputStream()); 
        contentWriter.write(textparam); 
        contentWriter.flush(); 
        contentWriter.close(); 

        InputStream answerInputStream = connection.getInputStream(); 
        final String answer = getTextFromInputStream(answerInputStream); 

        if(answer!="") { 
         String[] contactInfo = answer.split(":::::"); 

         contact.insertContact(contactInfo[0], contactInfo[1], contactInfo[2], contactInfo[3], contactInfo[4]); 
        } 
        answerInputStream.close(); 
        connection.disconnect(); 


       } catch (MalformedURLException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 

    } 
} 

@Override 
public void onReceive(final Context context, final Intent intent) { 
    callState = 0; 
    callInfoPreferenceManager = CallInfoPreferenceManager.getInstance(); 
    configPreferenceManager = ConfigPreferenceManager.getInstance(); 

    TelephonyManager telManager = (TelephonyManager) context 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    if (configPreferenceManager.getAutoRecord()) { 
     if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
      String textToServer = callInfoPreferenceManager.getPhoneNumber(); 
      sendToServer(textToServer.toString()); 
      Log.i("Gọi đến đã gửi->server:", textToServer.toString()); 
      callInfoPreferenceManager.setPhoneNumber(intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 
      callInfoPreferenceManager.setMyPhone(number); 
      callInfoPreferenceManager.setSending(String.valueOf(true)); 
     } 
    } 
    telManager.listen(new PhoneStateListener() { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      callDAO = new CallDAO(context); 
      if (configPreferenceManager.getAutoRecord()) { 
       if (state != pState) { 
        if (state == TelephonyManager.CALL_STATE_OFFHOOK && callInfoPreferenceManager.getCallState()) { 
         uri = Uri.withAppendedPath(
           ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 
           Uri.encode(callInfoPreferenceManager.getPhoneNumber())); 
         projection = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME 
           , ContactsContract.Contacts.PHOTO_ID 
         }; 

         // Query the filter URI 
         Cursor cursor = context.getContentResolver().query(uri, 
           projection, null, null, null); 
         if (cursor != null) { 
          if (cursor.moveToFirst()) { 
           callInfoPreferenceManager.setName(cursor.getString(cursor.getColumnIndex 
             (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))); 
           int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID)); 
           if (id != 0) { 
            callInfoPreferenceManager.setPhotoId(id); 
           } else { 
            callInfoPreferenceManager.setPhotoId(1); 
           } 
          } else { 
           callInfoPreferenceManager.setPhotoId(1); 
           callInfoPreferenceManager.setName("Số lạ"); 
          } 
         } 
         cursor.close(); 

         callInfoPreferenceManager.setCallState(CALLING); 
         callInfoPreferenceManager.setStartDate(DateFormat.format(
           CallFormatter.START_DATE_FORMAT, 
           System.currentTimeMillis()).toString()); 

         callInfoPreferenceManager.setStartTime(System 
           .currentTimeMillis()); 
         try { 
          Thread.sleep(1000);     //1000 milliseconds is one second. 
         } catch(InterruptedException ex) { 
          Thread.currentThread().interrupt(); 
         } 
         sIntent = new Intent(context.getApplicationContext(), 
           CallRecordService.class); 
         context.startService(sIntent); 

        } else if (state == TelephonyManager.CALL_STATE_RINGING && callInfoPreferenceManager.getCallState()) { 
         callInfoPreferenceManager.setPhoneNumber(incomingNumber); 
         String textToServer = callInfoPreferenceManager.getPhoneNumber(); 
         sendToServer(textToServer.toString()); 
         callInfoPreferenceManager.setSending(String.valueOf(false)); 

        } else if (state == TelephonyManager.CALL_STATE_IDLE && callInfoPreferenceManager.getCallState() == CALLING) { 
         long endTime = System.currentTimeMillis(); 
         long startTime = callInfoPreferenceManager.getStartTime(); 
         long callTime = endTime - startTime; 
         String totalTime = new SimpleDateFormat(
           CallFormatter.TIME_FORMAT).format(new Date(
           callTime - 32400000)); 
         callDAO.insert(callInfoPreferenceManager.getName(), 
           callInfoPreferenceManager.getPhoneNumber(), 
           callInfoPreferenceManager.getStartDate(), 
           totalTime, 
           callInfoPreferenceManager.getSending(), 
           callInfoPreferenceManager.getPhotoId(), 
           callInfoPreferenceManager.getStartDate() 
             + configPreferenceManager.getPathFormat()); 
         callDAO.close(); 

         sIntent = new Intent(context.getApplicationContext(), 
           CallRecordService.class); 
         context.stopService(sIntent); 

         callInfoPreferenceManager.setCallState(IDLE); 
         try { 
          Thread.sleep(1000);     //1000 milliseconds is one second. 
         } catch(InterruptedException ex) { 
          Thread.currentThread().interrupt(); 
         } 
        } else if (state == TelephonyManager.CALL_STATE_RINGING && 
          callInfoPreferenceManager.getCallState() == CALLING) { 
         callState = REFUSE; 
        } else if (state == TelephonyManager.CALL_STATE_OFFHOOK && callInfoPreferenceManager.getCallState() 
          == CALLING) { 
         callState = ACCEPT; 
        } else if (state == TelephonyManager.CALL_STATE_IDLE && callState == REFUSE) { 
         callInfoPreferenceManager.setCallState(IDLE); 
        } 
        pState = state; 
       } 
      } 
     } 
    }, PhoneStateListener.LISTEN_CALL_STATE); 
}//onReceive 

我检查你的答案,但是当在编辑我的代码,一类还呼吁insertContact,我试图添加onCreate(Context context, Bundle savedInstanceState),但不能使用带有参数Context context通。而这种代码在:

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

     addContactBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (insertContact(name, number, address, timeStart, timeCurrrentDate)) { 
       } 
      } 
     } 
    } 
} 
+0

发布错误日志.. –

+0

@RohitArya我更新了所有错误日志。 – vanloc

+0

你在哪里定义了'insertContact'方法?在“活动”或“片段”? –

回答

2

getContentResolver()android.content.Context类的方法,所以它肯定需要上下文的实例(如ActivityService)。 这是导致崩溃的原因。

要调用

ContentResolver contentResolver = this.getContentResolver();

这里this应该是Context子类的实例。如果您已经从activity呼叫此号码,请确保在onCreate方法activity之后呼叫此号码,因为那时activity级别不具有context

编辑1:

由于您使用Broadcast Receiver你应该通过context收到在这里:

onReceive (Context context, Intent intent){}

sentToServer方法的变更签名这样public void sendToServer(Context context, final String text)onReceive经过context调用。

@Override 
public void onReceive (Context context, Intent intent){ 
    sendToServer(context, "some text") 
} 

同样,改变insertContact方法public boolean insertContact(Context context, String firstName, String mobileNumber, String addressCall, String timeStart, String currentDate)

的签名,并得到ContentResolver这样的:

ContentResolver contentResolver = context.getContentResolver(); 

希望这可以帮助你!

+0

谢谢你的回答。我更新了我的问题。在其他类中,我也用来调用'insertContact'类'onCreate'事件。我试图添加“上下文上下文”,但无法正常工作。 – vanloc

+0

它是哪一类?你能不能更新...如果这个解决方案解决了你的问题,你能接受吗? –

+0

在这个类中,我初始化:'private static Context mContext;'并在'onCreate'事件中添加新行'mContext = getApplicationContext();'。这工作。 – vanloc

相关问题