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;
}
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.