Reputation: 507
I have a widget that when I click it, I want to create an SMS and open the Default Text Message app. I have the second part (sms creation -> intent, startactivity open Default sms app), but i cant figure out the first part.
onUpdate @ the widgetProvider class
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.sms_widget);
views.setOnClickPendingIntent(R.id.docButton, getPendingSelfIntent(context, SMS1));
views.setOnClickPendingIntent(R.id.shopButton, getPendingSelfIntent(context, SMS2));
views.setOnClickPendingIntent(R.id.bankButton, getPendingSelfIntent(context, SMS3));
views.setOnClickPendingIntent(R.id.helpButton, getPendingSelfIntent(context, SMS4));
views.setOnClickPendingIntent(R.id.familyButton, getPendingSelfIntent(context, SMS5));
views.setOnClickPendingIntent(R.id.runButton, getPendingSelfIntent(context, SMS6));
ComponentName watchWidget = new ComponentName(context, smsWidget.class);
appWidgetManager.updateAppWidget(watchWidget, views);
}
}
@Override
public void onReceive(Context context, Intent intent) {
SmsHelper smsHelper = SmsHelper.getInstance();
Log.d("widget", "on receive 1");
User user= PreferencesManager.getObject("user", User.class);
super.onReceive(context, intent);
if(SMS1.equals(intent.getAction())){
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews;
ComponentName watchWidget;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.sms_widget);
watchWidget = new ComponentName(context, smsWidget.class);
appWidgetManager.updateAppWidget(watchWidget, remoteViews);
smsHelper.sendSms(PHONE_NUMBER, "1 " + user.getFullName() + " " + user.getAddress());
}
This is happening in the app widget provider but in order to start the default text message app i need to start it from an activity which is dead at the moment. `public class SmsHelper {
private static SmsHelper INSTANCE;
private SmsHelper(){
}
public static SmsHelper getInstance(){
synchronized (SmsHelper.class){
if (INSTANCE == null){
INSTANCE = new SmsHelper();
}
}
return INSTANCE;
}
public void sendSms(String phoneNumber, String message) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber));
intent.putExtra("sms_body", message);
startActivity(intent);
}}`
The last line ofc is not working, as i get a NPE at ActivityThreadApplicationThread
Upvotes: 1
Views: 46
Reputation: 95578
In order to call startActivity()
you need a Context
. You should pass a Context
in to the sendSms()
method. Like this:
@Override
public void onReceive(Context context, Intent intent) {
SmsHelper smsHelper = SmsHelper.getInstance();
Log.d("widget", "on receive 1");
User user= PreferencesManager.getObject("user", User.class);
super.onReceive(context, intent);
if(SMS1.equals(intent.getAction())){
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews;
ComponentName watchWidget;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.sms_widget);
watchWidget = new ComponentName(context, smsWidget.class);
appWidgetManager.updateAppWidget(watchWidget, remoteViews);
smsHelper.sendSms(PHONE_NUMBER, "1 " + user.getFullName() + " " + user.getAddress(), context);
}
and in SmsHelper
:
public void sendSms(String phoneNumber, String message, Context context) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber));
intent.putExtra("sms_body", message);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
NOTE: You will need to use FLAG_ACTIVITY_NEW_TASK
since you are launching an Activity
from a non-Activity context.
Upvotes: 1