访问sms时出现Android空指针异常
正在运行doinbackground方法时获取nullpointer异常。。这是我的错误![在此处输入图像描述][1] 这是我的错误:::访问sms时出现Android空指针异常,android,android-asynctask,sms,broadcastreceiver,Android,Android Asynctask,Sms,Broadcastreceiver,正在运行doinbackground方法时获取nullpointer异常。。这是我的错误![在此处输入图像描述][1] 这是我的错误::: FAIAL EXCEPTION: AsyncIask #1 java.1ang.RuntimeException: An error occured while executing doInBa 45 ckground() at android.os.AsyncIask$3.done(AsyncIask.java:278) at java.uti1.c
FAIAL EXCEPTION: AsyncIask #1
java.1ang.RuntimeException: An error occured while executing doInBa 45
ckground()
at android.os.AsyncIask$3.done(AsyncIask.java:278)
at java.uti1.concurrent.FutureIask$Sync.innerSetException(FutureIa 45
sk.java:273)
at java.uti1.concurrent.FutureIask.setException(FutureIask.java:12 45
4)
at java.uti1.concurrent.FutureIask$Sync.innerRun(FutureIask.java:3 45
07)
at java.uti1.concurrent.FutureTask.run(FutureIask.java:137)
at android.os.AsyncIask$Seria1Executor$1.run(AsyncIask.java:208)
at java.uti1.concurrent.ThreadPoo1Executor.runworker(IhreadPoo1Exe 45
cutor.java:1076)
at java.uti1.concurrent.IhreadPoo1Executor$Worker.run(IhreadPoo1Ex 45
ecutor.java:569)
at java.1ang.Ihread.run(Ihread.java:856)
Caused by: java.lang.NullPointerException
at com.examp1e.outgoingsms.OutgoingSmsListener$OutSmsLogger.doInBa 45
ckground(OutgoingSmsListener.java:45)
at com.examp1e.outgoingsms.OutgoingSmsListener$OutSmsLogger.doInBa 45
ckground(OutgoingSmsListener.java:1)
at android.os.AsyncIask$2.call(AsyncIask.java:264)
at java.uti1.concurrent.FutureIask$Sync.innerRun(FutureIask.java:3 45
05)
5 more
这是我的密码
public class OutgoingSmsListener extends BroadcastReceiver {
public Context context;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
new OutSmsLogger(context).execute();
}
public class OutSmsLogger extends AsyncTask<Void, Void, Void> {
private final Uri SMS_URI = Uri.parse("content://sms");
private final String[] COLUMNS = new String[] {"date", "address", "body", "type"};
private static final String CONDITIONS = "type = 2 AND date > ";
private static final String ORDER = "date DESC";
private SharedPreferences prefs;
private long timeLastChecked;
private Cursor cursor;
public OutSmsLogger(Context context) {
this.prefs = context.getSharedPreferences("some_file_name", Context.MODE_PRIVATE);
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
timeLastChecked = prefs.getLong("time_last_checked", -1L);
ContentResolver cr = context.getContentResolver();
// get all sent SMS records from the date last checked, in descending order
cursor = cr.query(SMS_URI, COLUMNS, CONDITIONS + timeLastChecked, null, ORDER);
// if there are any new sent messages after the last time we checked
if (cursor.moveToNext()) {
Set<String> sentSms = new HashSet<String>();
timeLastChecked = cursor.getLong(cursor.getColumnIndex("date"));
do {
long date = cursor.getLong(cursor.getColumnIndex("date"));
String address = cursor.getString(cursor.getColumnIndex("address"));
String body = cursor.getString(cursor.getColumnIndex("body"));
String thisSms = date + "," + address + "," + body;
if (sentSms.contains(thisSms)) {
continue; // skip that thing
}
// else, add it to the set
sentSms.add(thisSms);
Log.d("Test", "date sent: " + date);
Log.d("Test", "target number: " + address);
Log.d("Test", "number of characters: " + body.length());
} while (cursor.moveToNext());
}
cursor.close();
Editor editor = prefs.edit();
editor.putLong("time_last_checked", timeLastChecked);
editor.commit();
return null;
}
}
}
public class OutgoingSmsListener扩展了BroadcastReceiver{
公共语境;
@凌驾
公共void onReceive(上下文、意图){
//TODO自动生成的方法存根
新建OutsmLogger(上下文).execute();
}
公共类OutsmLogger扩展异步任务{
私有最终Uri SMS_Uri=Uri.parse(“content://sms");
私有最终字符串[]列=新字符串[]{“日期”、“地址”、“正文”、“类型”};
私有静态最终字符串条件=“type=2和date>”;
私有静态最终字符串顺序=“日期描述”;
私人共享参考优先权;
私人长时间检查;
私有游标;
公共输出MSLogger(上下文){
this.prefs=context.getSharedReferences(“一些文件名”,context.MODE\u PRIVATE);
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
timeLastChecked=prefs.getLong(“上次检查的时间”,-1L);
ContentResolver cr=context.getContentResolver();
//从上次检查的日期开始,按降序获取所有已发送的SMS记录
cursor=cr.query(SMS_URI、列、条件+timeLastChecked、null、ORDER);
//上次检查后是否有新发送的消息
if(cursor.moveToNext()){
Set sentSms=new HashSet();
timeLastChecked=cursor.getLong(cursor.getColumnIndex(“日期”);
做{
longdate=cursor.getLong(cursor.getColumnIndex(“日期”));
字符串地址=cursor.getString(cursor.getColumnIndex(“地址”);
String body=cursor.getString(cursor.getColumnIndex(“body”);
字符串thisSms=日期+“,“+地址+”,“+正文;
如果(sentSms.contains(thisSms)){
继续;//跳过那件事
}
//否则,将其添加到集合中
sentSms.add(thisSms);
日志d(“测试”,“发送日期:”+日期);
Log.d(“测试”,“目标编号:+地址”);
Log.d(“测试”,“字符数:”+body.length());
}while(cursor.moveToNext());
}
cursor.close();
编辑器编辑器=prefs.edit();
编辑器.putLong(“上次检查的时间”,timeLastChecked);
commit();
返回null;
}
}
}
请帮我找到一个解决方案。我也遇到了同样的问题,它只出现在一些设备上(或者我以前总是有一些数据) 问题是,当您将结果过滤到没有数据的时段(例如,您只需要最后一天的短信,而用户没有发送任何短信)时,您会得到null光标。我觉得这很奇怪,我相信在一些设备上,你们得到了正确初始化的游标,只是它是空的,但在其他设备上你们得到了空的,所以在访问游标之前,一定要检查空指针
顺便说一句,“问题已解决”,但不提供答案?不酷,伙计 您是否添加了此权限<代码>是。。权限已添加@这是第45行:字符串地址=cursor.getString(cursor.getColumnIndex(“地址”);你是否及时检查变量,并正确填写日期?你调试过吗?是的。。。我答对了…问题解决了。。。谢谢你宝贵的回复。。