0
我正在构建一个测试应用程序,以根据数据库列表阻止对电话的传入呼叫。数据库运行正常,我遇到的问题是与呼叫接收器。当我尝试读取数据库并根据数据库中的值检查传入呼叫时,出现错误。我使用SQLite在onReceive中读取错误
代码:
package com.call.blocker;
import java.lang.reflect.Method;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.internal.telephony.ITelephony;
public class CustomBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "Phone Call";
Context context = null;
private ITelephony telephonyService;
public String[] GatherNumbers() {
int i = 0;
Dbhelper dbHelper = new Dbhelper(CustomBroadcastReceiver.this);
SQLiteDatabase db = dbHelper.getReadableDatabase(); //Problem is here
Cursor cursor = db.rawQuery("SELECT " + Dbhelper.C_NUM + " FROM " + Dbhelper.TABLE, null);
String[] myNumbers = new String[cursor.getCount() - 1];
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
myNumbers[i] = cursor.getString(cursor.getColumnIndex(Dbhelper.C_NUM));
i++;
} while (cursor.moveToNext());
}
}
return myNumbers;
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
TelephonyManager telephony = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
if (null == bundle)
return;
Log.v(TAG, bundle.toString() + " 1");
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
Log.v(TAG, "State: " + state + " 2");
if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {
String phonenumber = bundle
.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.v(TAG, "Incomng Number: " + phonenumber);
try {
String[] MyNumbers = GatherNumbers();
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
telephonyService.silenceRinger();
telephonyService.endCall();
Log.v(TAG, "Ending Call");
} catch (Exception e) {
e.printStackTrace();
Log.v(TAG, "Error Ending Call");
}
}
}
}
这是给我这个在logcat中:
java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
at com.call.blocker.CustomBroadcastReceiver.GatherNumbers(CustomBroadcastReceiver.java:22)
at com.call.blocker.CustomBroadcastReceiver.onReceive(CustomBroadcastReceiver.java:59)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:1769)
at android.app.ActivityThread.access$2400(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:978)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3647)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
我似乎无法弄清楚它为什么无法打开数据库和崩溃的应用程序。如果我删除线
String[] MyNumbers = GatherNumbers();
它阻止所有呼叫没有问题。但是,尝试失败的那条线。
仍给我同样的问题。即使上下文保持为null,它似乎也不会影响脚本中给我带来问题的部分 – user715950 2011-04-20 00:45:53