0

i need your help..i am getting incoming call mobile no. using broadcastreceiver and and want to save that no into my database..but when i do that it shows :- Attempt to invoke virtual method 'android.content.Context.getResources()' on a null object reference...please guys help me...thanx in advance...

ServiceReceiver.java

public class ServiceReceiver extends BroadcastReceiver {

MyReceiver receiver = new MyReceiver();

@Override
public void onReceive(final Context context, Intent intent) {


    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(new PhoneStateListener(){
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);


                System.out.println("incomingNumber :" + incomingNumber);
                receiver.setData(incomingNumber, context);


        }
    }, PhoneStateListener.LISTEN_CALL_STATE);
}}

DataBaseHelper.java

public class DataBaseHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "callinfo.db";
public static final String TABLE_NAME = "misscall";
public static final String COL_1 = "ID";
public static final String COL_2 = "MOBILE";

public DataBaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);

    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {

    sqLiteDatabase.execSQL("create table " + TABLE_NAME +" (ID INTEGER PRIMARY KEY AUTOINCREMENT,MOBILE VARCHAR(20));");
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    sqLiteDatabase.execSQL("DROP TABLE IF EXITS"+ TABLE_NAME );
    onCreate(sqLiteDatabase);
}
public boolean insertData(String mobile) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_2,mobile);
    long result = db.insert(TABLE_NAME,null ,contentValues);
    if(result == -1)
        return false;
    else
        return true;
}}

MyReceiver.java

public class MyReceiver extends AppCompatActivity {

DataBaseHelper myDB;

public MyReceiver(){


}

public void setData(String incomingNumber, Context context){


    myDB = new DataBaseHelper(context);//i think here i get that error
    Toast.makeText(context, incomingNumber, Toast.LENGTH_LONG).show();
    save(incomingNumber,context);

}


public  void save(String number,Context context){

    if(number!=null){
        AddData(number);

    }

}

public void AddData(String number) {

  boolean isInserted = myDB.insertData(number);

    if(isInserted == true)
        Toast.makeText(MyReceiver.this, "Data Inserted", Toast.LENGTH_LONG).show();

    else
        Toast.makeText(MyReceiver.this,"Data not Inserted", Toast.LENGTH_LONG).show();
} }

error

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
                                                                                       at android.content.ContextWrapper.getResources(ContextWrapper.java:90)
                                                                                       at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:74)
                                                                                       at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:551)
                                                                                       at android.widget.Toast.<init>(Toast.java:122)
                                                                                       at android.widget.Toast.makeText(Toast.java:290)
                                                                                       at com.example.abhijeetsingh.recievecall.MyReceiver.setData(MyReceiver.java:51)
                                                                                       at com.example.abhijeetsingh.recievecall.ServiceReceiver$1.onCallStateChanged(ServiceReceiver.java:37)
                                                                                       at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:404)
                                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                       at android.os.Looper.loop(Looper.java:145)
                                                                                       at android.app.ActivityThread.main(ActivityThread.java:5951)
                                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                                       at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
                                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Abhi
  • 43
  • 2

1 Answers1

0

Obviously, you have got an incorrect implementation of AppCompatActivity class.

this code has an incorrect point: Toast.makeText(MyReceiver.this, "Data Inserted", Toast.LENGTH_LONG).show();

I mean Toast.makeText needs a context variable which is correctly generated .

public class MyReceiver {

DataBaseHelper myDB;

public MyReceiver(){


}

public void setData(String incomingNumber, Context context){


    myDB = new DataBaseHelper(context);//i think here i get that error
    Toast.makeText(context, incomingNumber, Toast.LENGTH_LONG).show();
    save(incomingNumber,context);

}


public  void save(String number,Context context){

    if(number!=null){
        AddData(number, context);

    }

}

public void AddData(String number, Context context) {

  boolean isInserted = myDB.insertData(number);

    if(isInserted == true)
        Toast.makeText(context, "Data Inserted", Toast.LENGTH_LONG).show();

    else
        Toast.makeText(context,"Data not Inserted", Toast.LENGTH_LONG).show();
} }

To correctly use an Activity class you have to initialize in via startActivity method that directly launch a window.

Vyacheslav
  • 26,359
  • 19
  • 112
  • 194