访问sms时出现Android空指针异常

访问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

正在运行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.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(“地址”);你是否及时检查变量,并正确填写日期?你调试过吗?是的。。。我答对了…问题解决了。。。谢谢你宝贵的回复。。