EditTextを介してユーザーによる文字列の入力を受け取り、それらを共有設定に入れ、SMSが受信されたときに自動SMSを送信するアプリを作成しています。共有設定の文字列を使用して、自動的に送信される電話番号とテキストメッセージを指定します。送信済。
送信する電話番号とテキストメッセージをハードコーディングしている限り、アプリは完全に機能します。共有設定の文字列をSendSMSメソッドに入れようとするとすぐに、アプリがクラッシュし、デバッグエラー「hasUserDataHeader:false」が発生します。
以下のコードは、名前EditTextから文字列を取得し、それをパラメーターTextMessageを介して送信されるメッセージとして使用しようとするバージョンです(このコード行については、ブロードキャストレシーバー内を参照してください)。これを「TextMessage」に置き換えると問題ありませんが、明らかにこれではテキストが動的に送信されません
以下のコード:
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Button;
import android.app.PendingIntent;
import android.content.Intent;
import android.telephony.SmsManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.widget.TextView;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.SharedPreferences;
public class MainActivity extends Activity {
int notificationID = 1;
String[] excuses;
String excuseSelected;
IntentFilter intentFilter;
private SharedPreferences prefs;
private String prefName = "MyPref";
private static final String NUMBER_KEY = "number";
private static final String NAME_KEY = "name";
private static final String EXCUSE_KEY = "excuse";
private BroadcastReceiver intentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//---gather up all the necessary user input---
prefs = getSharedPreferences(prefName, MODE_PRIVATE);
String textMessage = (String) prefs.getString(NAME_KEY, "");
sendSMS("0403579838", textMessage);
// }
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//---intent to filter for SMS messages received---
intentFilter = new IntentFilter();
intentFilter.addAction("SMS_RECEIVED_ACTION");
final Button btn1 = (Button)findViewById(R.id.buttonToggle);
excuses = getResources().getStringArray(R.array.excuses_array);
Spinner s1 = (Spinner) findViewById(R.id.spinnerExcuse);
final EditText EditTextNumber = (EditText) findViewById(R.id.editTextNumber);
final EditText EditTextName = (EditText) findViewById(R.id.editTextName);
//---Sorting the spinner view out for excuses selection---
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, excuses);
s1.setAdapter(adapter);
s1.setOnItemSelectedListener(new OnItemSelectedListener()
{
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3)
{
int index = arg0.getSelectedItemPosition();
excuseSelected = excuses[index];
}
public void onNothingSelected(AdapterView<?> arg0) {}
});
//---Setting the button to toggle between on and off---
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (btn1.getText().equals("Turn on"))
{
btn1.setText("Turn off");
//---register the receiver---
registerReceiver(intentReceiver, intentFilter);
//---get the SharedPreferences object---
prefs = getSharedPreferences(prefName, MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
//---set the user inputs to prefo's---
editor.putString(NUMBER_KEY, EditTextNumber.getText().toString());
editor.putString(NAME_KEY, EditTextName.getText().toString());
editor.putString(EXCUSE_KEY, excuseSelected);
}
else
{
btn1.setText("Turn on");
//---unregister the receiver---
unregisterReceiver(intentReceiver);
}
}
});
}
//---sends an SMS message to another device---
public void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);
displayNotification();
}
protected void displayNotification()
{
Intent i = new Intent(this, NotificationView.class);
i.putExtra("notificationID", notificationID);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
Notification notif = new Notification(
R.drawable.ic_launcher,
"SMS has been sent by GirlfriendMinder",
System.currentTimeMillis());
CharSequence from = "GirlfriendMinder";
CharSequence message = "SMS has been sent by GirlfriendMinder";
notif.setLatestEventInfo(this, from, message, pendingIntent);
//---100ms delay, vibrate for 250ms, pause for 100ms, and then vibrate for 500ms---
notif.vibrate = new long[] { 100, 250, 100, 500};
nm.notify(notificationID, notif);
}
@Override
protected void onDestroy() {
//---unregister the receiver---
unregisterReceiver(intentReceiver);
super.onPause();
}
}