- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天我构建了一个新的应用程序来添加联系人,但是我在 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
调用它,那么请确保它是在 activity
的 onCreate
方法之后调用的,因为到那时 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/
我正在将我的模板代码移植到 XTend。在某些时候,我在测试用例中有这种类型的条件处理: @Test def xtendIfTest() { val obj = new FD if (
我是新来的 kotlin , 当我开始 Null Safety 时,我对下面的情况感到困惑. There's some data inconsistency with regard to initia
我的应用程序一直在各种Android版本中保持良好状态。我有用户在Android 4.3、5.0、5.1和6.0上正常运行。但是,具有S7 Edge的用户刚刚更新了Android 7.0,将文本粘贴到
我使用的是最新版本的 LWUIT (1.5)。我在资源编辑器中设计了我的表单,然后将代码生成到 netbeans。问题是如果我想访问除表单之外的任何对象,我会收到此错误: java.lang.Null
更新: 我在 Fedora 21 上运行它。 SonarQube - 5.0。 SonarQube Runner - 2.4 更新 2:Findbugs v3.1,Java 插件 v2.8 更新3:
RecupData 我的类仅在 web 中返回 NullPointerException。我连接到 pgsql db 8.3.7 - 该脚本在“控制台”syso 中运行良好 - 但引发了测试 Web
我在 mac 上使用 Processing 2.08。我正在尝试使用文档中给出的 createShape 函数创建 PShape。 PShape s; void setup(){ size(500
我在 mac 上使用 Processing 2.08。我正在尝试使用文档中给出的 createShape 函数创建 PShape。 PShape s; void setup(){ size(500
每次运行此 jsp 时,都会收到以下错误异常: org.apache.jasper.JasperException: java.lang.NullPointerException root cause
Kotlin 在编译时有一个出色的 null 检查,使用分离到“可空?”和“不可为空”的对象。它有一个 KAnnotator 来帮助确定来自 Java 的对象是否可以为空。但是,如果 not-null
我有一个布局将显示一个TextView,用于显示一个滴答时间。我遵循了此链接中的代码 How to Display current time that changes dynamically for
Elasticsearch 1.4.1版(“lucene_version”:“4.10.2”) 我有一个像这样的文件: $ curl 'http://localhost:9200/blog/artic
这是我从另一个类调用函数的方法Selenium 设置已定义。 public void Transfer() throws Exception { System.out.println("\nTrans
我试图在主类中使用我在此类中创建的函数,但它崩溃并显示“警告:无法在根 0 处打开/创建首选项根节点 Software\JavaSoft\Prefsx80000002。 Windows RegCrea
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 我有一个 Java 代码,它将
我声明了两张牌: Card card1 = new Card('3', Card.Suit.clubs); Card card2 = new Card('T', Card.Suit.diamonds)
我编写了一段代码来解码 Base64 图像并在 javafx 中表示该图像。在我的 url base64 代码中不断变化。这就是我在 javafx 代码中使用任务的原因。但我收到错误:java.lan
我正在尝试使用 arrayList 的 arrayList 在 Java 中实现图形。 每当调用 addEdge 函数时,我都会收到 NullPointerException 。我似乎无法弄清楚为什么
我是 Java/android 的新手,所以很多这些术语都是外国的,但我愿意学习。我不打算详细介绍该应用程序,因为我认为它不相关。我目前的问题是,我使用了博客中的教程和代码 fragment ,并使我
我正在开发一个 Android 应用程序来在 Android developer guide 的帮助下录制视频.我程序上的所有代码都与此页面相同。 我在 之外定义了权限标签。 当应
我是一名优秀的程序员,十分优秀!