各位大虾同志
再做一个类似于黑名单的小应用,自学成才,思路是这样,MyBootReceiver类设置开机启动MyListenerService中的服务,该服务所做的操作就是监听MyPhoneListener类里面的onCallStateChanged,若来电,则判断是否是存在SQLite里面的电话号码,目前错在这里
来电时,进行号码判断,去读数据库然后遍历看是否与数据库号码相同,读数据库的时候出错
代码
- Java code
public boolean judgeincomingcall(String incomingNumber){ Log.i(tag, "MyPhoneListener incoming call is "+ incomingNumber); mBlackListActivity = new BlackListActivity(); MyDataBaseAdapter mMyDataBaseAdapter = new MyDataBaseAdapter(mBlackListActivity); mMyDataBaseAdapter.onlyReadOpen();...}
onlyReadOpen:
- Java code
public void onlyReadOpen() throws SQLException { Log.i(tag, "MyDataBaseAdapter onlyReadOpen()"); mDatabaseHelper = new DatabaseHelper(mContext); mSQLiteDatabase = mDatabaseHelper.getReadableDatabase(); // 这里出错 }
我想请教的是,这里面的Context的作用是什么?因为是后台运行的服务,所以运行时没有Activity,只有在设置添加黑名单号码的时候才会打开BlackListActivity这个页面,并且设置的时候读取数据库是正常的!
出错Log:
11-15 05:57:32.710: E/AndroidRuntime(367): java.lang.NullPointerException
11-15 05:57:32.710: E/AndroidRuntime(367): at android.content.ContextWrapper.openOrCreateDatabase(SourceFile:234)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SourceFile:149)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SourceFile:218)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.techfaith.blacklist.MyDataBaseAdapter.onlyReadOpen(MyDataBaseAdapter.java:67)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.techfaith.blacklist.MyPhoneListener.judgeincomingcall(MyPhoneListener.java:43)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.techfaith.blacklist.MyPhoneListener.onCallStateChanged(MyPhoneListener.java:27)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.telephony.PhoneStateListener$2.handleMessage(SourceFile:356)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.os.Handler.dispatchMessage(SourceFile:130)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.os.Looper.loop(SourceFile:351)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.app.ActivityThread.main(SourceFile:3814)
11-15 05:57:32.710: E/AndroidRuntime(367): at java.lang.reflect.Method.invokeNative(Native Method)
11-15 05:57:32.710: E/AndroidRuntime(367): at java.lang.reflect.Method.invoke(Method.java:538)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(SourceFile:901)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit.main(SourceFile:659)
11-15 05:57:32.710: E/AndroidRuntime(367): at dalvik.system.NativeStart.main(Native Method)
十分感谢!
------解决方案--------------------
service是必须通过UI组件触发来启动的,不能自启动,因此必须有上下文context,同时SQLiteOpenHelper类作为后台数据获取,获取后必然会对UI界面进行填充或者对UI界面进行一些显示之类的操作,没有context的话如何使两者联系起来达到数据交换和控制的目的?
关于异常的错误,推测有两种可能:
1、如果是自己创建的数据库,可能数据库创建不成功,进DDMS里面用命令行直接访问下数据库看看是否能够正常访问。
2、如果用系统自带的联系人数据库的话,必须用uri的方式访问
-----个人愚见
------解决方案--------------------
进DDMS后进入与你项目包名对应的目录下面,里面有个data文件夹,假设里面数据库文件叫abc.db,就在命令行里面输入sqlite3 abc.db就可以进入到sqlite命令行下面了,接下来可以用.tables;查看所有表,查询的语句跟SQLSERVER一样的。
PS:你的Service在没有context的情况下是怎么控制跟UI交互?另外检查一下AndroidManifest.xml里面有没有配置对应的<service>节点
------解决方案--------------------
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.