Ошибка чтения SQLite в onReceive

#java #android #sqlite

#java #Android #sqlite

Вопрос:

Я создаю тестовое приложение для блокировки входящих вызовов на телефон на основе списка базы данных. База данных работает нормально, проблема, с которой я столкнулся, связана с получателем вызова. Когда я пытаюсь прочитать базу данных и сверить входящий вызов со значениями в базе данных, я получаю сообщение об ошибке.

Код, который я использую:

 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();
  

у него нет проблем с блокировкой всех вызовов. Но с этой строкой попытка завершается неудачей.

Ответ №1:

Не должно ли это быть

 Dbhelper dbHelper = new DatabaseHelper(context);
  

?

Кстати, поле контекста, похоже, всегда равно нулю.

Комментарии:

1. Все еще вызывает у меня те же проблемы. И даже при том, что контекст остается нулевым, это, похоже, не влияет на ту часть скрипта, которая вызывает у меня проблемы