0

SMS メッセージ イベントをスケジュールして自分の電話に送信するプログラムを作成しようとしています。何らかの理由で機能しません。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 メソッドの内部では、アプリが以前に開かれたことがない場合は、マネージャーを新しい 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
    }

構成ページには、ユーザーが時間制約を選択できる 2 つのタイム ピッカーと、メッセージを受信する頻度の複数のオプションを備えた頻度スピナーがあります。テストのために、私は毎分使用しました。このコードは、設定画面の 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>

4

1 に答える 1

0

AndroidManifest.xml電話からメッセージを送信する必要がある場合は、ファイルに追加する許可があります。

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

これを追加しましたか?あなたはこれを見逃すかもしれないと思います!

このチュートリアルを確認してください。

于 2013-02-09T23:02:17.377 に答える