我正在尝试使用默认的SMS应用程序来实现发送SMS的代码,但是我得到的是空上下文,我不明白为什么。
我已经尝试使用getBaseContext(),getContext(),getApplicationContext失败了。
我在做什么错了?
我正在Moto E5 Android 8.1 Go上测试此代码。
代码在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);
}
}
HomeFragment类的一部分
@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;
}
答案 0 :(得分:1)
new MainActivity().sendSMS(message);
-这行不通。首先,您不通过其构造函数实例化Activity,而是使用Intent
实例化;其次,因为您不想创建新的Activity,而是访问该片段当前附加的Activity。
为了从您的Fragment与主机Activity通信,您可以看到我的答案here (see Methods 2 and 3)和this sample project。这些技术在Android Documentation中也有概述。