2011-04-19 25 views
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(); 

它阻止所有呼叫没有问题。但是,尝试失败的那条线。

回答

0

它不应该是

Dbhelper dbHelper = new DatabaseHelper(context); 

BTW上下文字段总是空,看来。

+0

仍给我同样的问题。即使上下文保持为null,它似乎也不会影响脚本中给我带来问题的部分 – user715950 2011-04-20 00:45:53