Why is the context null?

Issue

I’m trying to implement code that sends an SMS by using the default SMS application but I’m getting null context and I don’t understand why.

I already tried with getBaseContext(), getContext(), getApplicationContext with no success.

What am I doing wrong?

I’m testing this code on a Moto E5 Android 8.1 Go.

The code is inside of MainActivity.java

public void sendSMS(String msg)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) // At least KitKat
    {
        String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(this); //<---Line 107 --- Need to change the build to API 19

        Intent sendIntent = new Intent(Intent.ACTION_SEND);
        sendIntent.setType("text/plain");
        sendIntent.putExtra(Intent.EXTRA_TEXT, msg);

        if (defaultSmsPackageName != null)// Can be null in case that there is no default, then the user would be able to choose
        // any app that support this intent.
        {
            sendIntent.setPackage(defaultSmsPackageName);
        }
        startActivity(sendIntent);
    }
    else // For early versions, do what worked for you before.
    {
        Intent smsIntent = new Intent(Intent.ACTION_VIEW);
        smsIntent.setType("vnd.android-dir/mms-sms");
        smsIntent.putExtra("address", SMSParameters.getTelefono(this));
        smsIntent.putExtra("sms_body",msg);
        startActivity(smsIntent);

    }
}

Part of HomeFragment class

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
{
    View view = inflater.inflate(R.layout.fragment_home, container, false);

    final Button buttonAusente = view.findViewById(R.id.button_ausente);
    buttonAusente.setOnClickListener(new View.OnClickListener()
    {

        public void onClick(View view)
        {
            String message = null;

                //enviarComando AUSENTE

                //Line 70 below
            message = MessageGenerator.getMessageAusente(_password, _id, SMSParameters.getSecuencia(getContext())); //<-- Line 70
            new MainActivity().sendSMS(message);

        }
    });

    final Button buttonDesactivar = view.findViewById(R.id.button_desactivar);
    buttonDesactivar.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view)
        {
            String message = null;
           //enviarComando DESACTIVAR
            message = MessageGenerator.getMessageDesactivar(_password, _id, SMSParameters.getSecuencia(getContext()));
            new MainActivity().sendSMS(message);

        }
    });

    final Button buttonPresente = view.findViewById(R.id.button_presente);
    buttonPresente.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {
            String message = null;

               // enviarComando PRESENTE
            message = MessageGenerator.getMessagePresente(_password, _id, SMSParameters.getSecuencia(getContext()));
            new MainActivity().sendSMS(message);
        }
    });

    final Button buttonPanico = view.findViewById(R.id.button_panico);
    buttonPanico.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {
            String message = null;

            //  enviarComando(Comandos.PANICO);
            message = MessageGenerator.getMessagePanico(_password, _id, SMSParameters.getSecuencia(getContext()));
            new MainActivity().sendSMS(message);

        }
    });

    setStatusIcon(getContext(), Comandos.AUSENTE, view);
    setStatusIcon(getContext(), Comandos.DESACTIVAR, view);
    setStatusIcon(getContext(), Comandos.PRESENTE, view);
    setStatusIcon(getContext(), Comandos.PANICO, view);

    saveViewStatus(view);

    return view;
}

Solution

new MainActivity().sendSMS(message); – This wont work. First, you do not instantiate Activities via their constructor, but with an Intent, and second, because you don’t want to create a new activity, but access the Activity the Fragment is currently attached to.

In order to communicate with the host Activity from your Fragment, you can see my answer here (see Methods 2 and 3) and this sample project. These techniques are also outlined in the Android Documentation.

Answered By – PPartisan

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published