gpt4 book ai didi

java - 致命异常 : Thread-128 java. lang.NullPointerException

转载 作者:行者123 更新时间:2023-11-29 04:48:40 25 4
gpt4 key购买 nike

今天我构建了一个新的应用程序来添加联系人,但是我在 log cat 中有这样的错误:

threadid=11: thread exiting with uncaught exception (group=0xa4ca6b20)

FATAL EXCEPTION: Thread-128

Process: kr.co.composer.callrecord, PID: 5275 java.lang.NullPointerException

at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:99)

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

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

at 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) 但不能' t 使用带参数的传递 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)) {
}
}
}
}
}

最佳答案

getContentResolver()android.content.Context 类的方法,因此它肯定需要一个 Context 实例(如 Activity服务)。 这就是崩溃的原因。

你在打电话

ContentResolver contentResolver = this.getContentResolver();

这里的this应该是Context的子类的实例。如果您已经从 activity 调用它,那么请确保它是在 activityonCreate 方法之后调用的,因为到那时 activity 类没有 context

编辑 1:

由于您使用的是 Broadcast Receiver,因此您应该传递在此处收到的 context:

onReceive(Context 上下文,Intent Intent ){}

像这样更改 sentToServer 方法的签名 public void sendToServer( Context context, final String text) 并从 onReceive 调用传递 上下文

@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();

希望对您有所帮助!

关于java - 致命异常 : Thread-128 java. lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36257424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com