短信息发送在Android中无法正常工作

时间:2013-02-09 22:49:03

标签: android alarmmanager smsmanager

我正在尝试创建一个程序来安排短信息事件,将其发送到您自己的手机。由于某种原因,它不起作用。我创建了一个扩展BroadcastReceiver的SmsAlarm类,它的作用是设置/取消警报。这是班级:

public class SmsAlarm extends BroadcastReceiver {
private int hour1, minute1, hour2, minute2, frequency;
private PendingIntent pi;

@Override
public void onReceive(Context context, Intent intent) {
    SmsManager manager = SmsManager.getDefault();
    TelephonyManager tMgr =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    String phoneNumber = tMgr.getLine1Number();
    Calendar c = Calendar.getInstance();
    int currentHour = c.get(Calendar.HOUR_OF_DAY);
    int currentMinute = c.get(Calendar.MINUTE);
    if (currentHour >= hour1 && currentHour <= hour2 && currentMinute >= minute1 && currentMinute <= minute2) {
        String[] messages = context.getResources().getStringArray(R.array.messages);
        manager.sendTextMessage(phoneNumber, phoneNumber, messages[(int)(Math.random() * messages.length)], pi, null);
    }
}

public void SetAlarm(Context context) {
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, SmsAlarm.class);
    pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * frequency, pi); //millisecond * second * minutes
}

public void CancelAlarm(Context context) {
    Intent intent = new Intent(context, SmsAlarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
}
//getters and setters after this method

为了在每次打开应用程序时使用相同的调度程序,我们会在安装后第一次运行应用程序时序列化SmsManager对象。这些是我的MainActivity类中的saveAlarm和loadAlarm方法:

public void saveAlarm(Context context){
    try{
    FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
    ObjectOutputStream os = new ObjectOutputStream(fos);
    os.writeObject(manager);
    os.close();
    }
    catch(IOException e){
        e.printStackTrace();
    }
}

public SmsAlarm loadAlarm(Context context){

    try{
    FileInputStream fis = context.openFileInput(FILENAME);
    ObjectInputStream is=new ObjectInputStream(fis);
    try {
        manager=(SmsAlarm) is.readObject();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    is.close();

    }
    catch(IOException e){
        e.printStackTrace();
    }
    return manager;
}

在MainActivity.java中我有一个SmsManager的私有实例变量,在onCreate方法中,如果以前从未打开过该应用程序,我将manager设置为新的SmsManager:

if (!welcomeScreenShown) {
        manager = new SmsAlarm();
        saveAlarm(getApplicationContext());
        String whatsNewTitle = getResources().getString(R.string.whatsNewTitle);
        String whatsNewText = getResources().getString(R.string.whatsNewText);
        new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(whatsNewTitle).setMessage(whatsNewText).setPositiveButton(
                R.string.ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                }).show();
        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putBoolean(welcomeScreenShownPref, true);
        editor.commit(); // Very important to save the preference
    }

配置页面有两个时间选择器,用户可以选择时间限制,还有一个频率微调器,可以选择接收消息的频率。为了测试,我每分钟使用一次。此代码在配置屏幕的MainActivity的onCreate内部运行尚未显示:

if (configScreenShown)
    {
        manager = loadAlarm(getApplicationContext());
        //get the values from the SharedPreferences
        hour1 = setPrefs.getInt("hour1", 0);
        hour2 = setPrefs.getInt("hour2", 0);
        minute1 = setPrefs.getInt("minute1", 0);
        minute2 = setPrefs.getInt("minute2", 0);
        int freqInt = setPrefs.getInt("frequency", 0);
        frequencySet=freqInttoString(freqInt);

    }

它调用loadAlarm从上次打开应用程序时检索以前使用过的SmsAlarm。我认为SmsAlarm.java存在问题,我正在考虑摆脱该类并将所有逻辑放在MainActivity中。

清单文件:     

package="com.example.myapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
<uses-permission android:name="android.permission.GET_TASKS"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:debuggable="true" >
    <activity
        android:name="com.example.myapp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
   <receiver android:name=".SMSReceiver"> 
    <intent-filter>
    <action android:name="android.intent.action.DATA_SMS_RECEIVED" /> 
        <data android:scheme="sms" /> 
        <data android:port="8901" /> 
    </intent-filter> 
    </receiver>
</application>

1 个答案:

答案 0 :(得分:0)

如果您必须通过手机发送消息,则需要将权限添加到AndroidManifest.xml文件中。

<uses-permission android:name="android.permission.SEND_SMS"/>

你添加了吗?我想你可能会错过这个!

检查this tutorial