游标值为null

时间:2010-09-27 08:54:02

标签: android

我正在开发一个应用程序,通过内容解析器获取外发短信内容,但它提出了一些问题。请帮帮我。

package com.company.cellSafetyZone.model;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
public class OutGoingSmsService extends Service
{   Context context;
    SmsObserver smsObserver;
    Cursor cursor;
    Handler handler=new  Handler();
    private String TAG="SMS SERVICE";
    boolean change;
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    public OutGoingSmsService() 
    {
        Log.d(TAG,"blank constructor");
        // TODO Auto-generated constructor stub
    }
    public OutGoingSmsService(Context context)
    {
        Log.d(TAG,"context constructor");
        this.context=context;

    }
    @Override
    public void onCreate()
    {   Log.d(TAG,"in on Create() of sms service");
        super.onCreate();
        smsObserver=new SmsObserver(handler);
         Log.d(TAG,"calling service");
        startService();
    }
    private void startService()
    { Log.d(TAG,"registering resolver");
    cursor=this.getContentResolver().query(Uri.parse("content://sms/sent"), null,null,null,null);
        Log.d(TAG,"registering observer");
       cursor.registerContentObserver(smsObserver);
        Log.d(TAG,"registerd");
    }
    void setChangeValue(boolean selfChange)
    {System.out.println("in setChange");
        change=selfChange;
        if(change==false)
        {     try
{       cursor=context.getContentResolver().query(Uri.parse("content://sms/sent"), null,null,null,null);
            cursor.moveToFirst(); 
            }catch (Exception e)
            {   System.out.println("in catch."+e.getMessage());
                e.printStackTrace();
            }
            String protocol=cursor.getString(cursor.getColumnIndex("protocol"));
            Log.d(TAG,"protocol value."+protocol);
            if(protocol==null)
                onSmsSend();
            }}
    private void onSmsSend()
    { cursor.moveToFirst();
        for (int i = 0; i <cursor.getColumnCount(); i++) 
        {String column=cursor.getColumnName(i);
            String msg=cursor.getString(i); }}}

它正在调用观察者并以onSmsSend()方法再次返回此服务。但现在给出例外。

java.lang.NullPointerException
atcom.company.cellSafetyZone.model.OutGoingSmsService.setChangeValue(OutGoingSmsService.java:104)
at com.company.cellSafetyZone.model.SmsObserver.onChange(SmsObserver.java:42)
at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:43)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4203)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
at dalvik.system.NativeStart.main(Native Method)

为什么游标为null?有一件小事我无法抓住,所以请帮帮我。

2 个答案:

答案 0 :(得分:0)

我没有看到任何错误的编程,因为你可以在其他部分获得光标,但是当你得到nullpointer异常时我认为你应该在游标查询后的每个时间间隔添加日志并写入游标的列数,这样你就可以找到任何错误的代码。


有人认为我可以建议你再次在你的onsmsend函数中添加游标查询。

答案 1 :(得分:0)

在注册之前打印一些关于光标内部的日志语句。喜欢:

Log.d(TAG, cursor.getString(c.getColumnIndex("body")));

我要求您这样做,因为并非所有手机都会将SMS数据与该内容提供商存储在一起。无论出于何种原因,没有官方的方法来获取SMS数据,只是许多应用程序和制造商决定解决这个问题。