web-dev-qa-db-ja.com

AndroidたくさんのSMSメッセージを送信する

中央サーバーに大量のSMSメッセージを送信するアプリがあります。各ユーザーはおそらく1日あたり最大300のtxtを送信します。 SMSはほとんどどこにでもあり、モバイルインターネットはそうではないため、SMSメッセージはネットワーク層として使用されています。このアプリは、モバイルインターネットが普及していない多くの第三世界の国々での使用を目的としています。

100メッセージの制限に達すると、送信されたメッセージごとにプロンプ​​トが表示されます。プロンプトには、「SMSメッセージが大量に送信されています」と表示されます。これは、アプリがテキストメッセージを送信できるかどうかを尋ねるたびにユーザーにプロンプ​​トが表示されるのは問題です。ユーザーは、30回連続してプロンプトを表示したくありません。

このAndroidソースファイルをグーグルで見つけました。古くなっている可能性がありますが、わかりません。アプリケーションごとに3600000ms(1日)ごとに100smsメッセージの制限があるようです。

http://www.netmite.com/Android/mydroid/frameworks/base/telephony/Java/com/Android/internal/telephony/gsm/SMSDispatcher.Java

/** Default checking period for SMS sent without uesr permit */
private static final int DEFAULT_SMS_CHECK_PERIOD = 3600000;

/** Default number of SMS sent in checking period without uesr permit */
private static final int DEFAULT_SMS_MAX_ALLOWED = 100;

そして

/**
 *  Implement the per-application based SMS control, which only allows
 *  a limit on the number of SMS/MMS messages an app can send in checking
 *  period.
 */
private class SmsCounter {
    private int mCheckPeriod;
    private int mMaxAllowed;
    private HashMap<String, ArrayList<Long>> mSmsStamp;

    /**
     * Create SmsCounter
     * @param mMax is the number of SMS allowed without user permit
     * @param mPeriod is the checking period
     */
    SmsCounter(int mMax, int mPeriod) {
        mMaxAllowed = mMax;
        mCheckPeriod = mPeriod;
        mSmsStamp = new HashMap<String, ArrayList<Long>> ();
    }

    boolean check(String appName) {
        if (!mSmsStamp.containsKey(appName)) {
            mSmsStamp.put(appName, new ArrayList<Long>());
        }

        return isUnderLimit(mSmsStamp.get(appName));
    }

    private boolean isUnderLimit(ArrayList<Long> sent) {
        Long ct =  System.currentTimeMillis();

        Log.d(TAG, "SMS send size=" + sent.size() + "time=" + ct);

        while (sent.size() > 0 && (ct - sent.get(0)) > mCheckPeriod ) {
                sent.remove(0);
        }

        if (sent.size() < mMaxAllowed) {
            sent.add(ct);
            return true;
        }
        return false;
    }
}

これも本物のAndroidコードですか?パッケージ「com.Android.internal.telephony.gsm」に含まれているようですが、AndroidのWebサイトでこのパッケージを見つけることができません。

この制限を無効/変更するにはどうすればよいですか?私は解決策を探していましたが、何も見つかりませんでした。


そこで、commonsware.comが投稿したリンクを調べていたところ、ソースが実際に変更されていることがわかりました。だから私はまだショットを持っているかもしれません。

    int check_period = Settings.Gservices.getInt(mResolver,
            Settings.Gservices.SMS_OUTGOING_CEHCK_INTERVAL_MS,
            DEFAULT_SMS_CHECK_PERIOD);
    int max_count = Settings.Gservices.getInt(mResolver,
            Settings.Gservices.SMS_OUTGOING_CEHCK_MAX_COUNT,
            DEFAULT_SMS_MAX_COUNT);
    mCounter = new SmsCounter(max_count, check_period);

これは、設定テーブルからcheckPeriodとmaxCountを取得しています。しかし、私は同じテーブルにアクセスできないようです。そのソースはAndroid 1.1である必要があります。これは、私が使用しているものと同じです。 Android.provider.Settings.Gservicesをインポートしようとすると、インポートを解決できないというエラーが表示されます。

何が起こっている?

20
Robert Parker

残念ながら、選択肢は少ないと思います

1)ルートアクセスを取得し、次の手順を実行して設定テーブルを直接変更します。

sqlite3 /data/data/com.Android.providers.settings/databases/settings.db

sqlite> INSERT INTO gservices (name, value) VALUES
('sms_outgoing_check_interval_ms', 0);

2)アプリごとの制限であるため、複数のアプリを使用します

3)限界に達した後、おそらくバッテリーを取り出しますか?制限がメモリに保存されているようです。私はまだこれを試していません。

4

「importAndroid.provider.Settings;」を使用してみましたか「Android.provider.Settings.GServicesをインポートする」の代わりに? ( SMSDispatcher.Java の36行目を参照)

また、どの程度の違いがあるかはわかりませんが、3600000ミリ秒は1日ではなく1時間時間です。

4
sdtom

これはAndroidソースツリーに組み込まれているようです。したがって、この変更をユーザーにプッシュダウンする唯一の方法は、独自のROMをビルドして彼らはそれをインストールします。

それを回避するためのアイデアについては、ネットワーク接続が存在しないと仮定するのではなく、最初にネットワーク接続を確認してみませんか。今日の大多数のデバイスに存在していなくても、常にそうであるとは限りません。 SMSをフォールバックメカニズムとします。フォールバックメカニズムの場合は、SMS 100メッセージ程度ごとのアクティビティ。誰が知っているか、彼らはWifiホットスポットにローミングし、その日の一部でも接続できる可能性があります。

それ以外の場合は、制限を回避するためにサイレントSMSプロキシとして機能できる他のアクティビティ+インテントの束をインストールするゲームに入ります。もちろん、これには望ましくない独自の特定のセットがあります品質も同様で、私はその邪悪なものをタイプした/提案しただけだとは信じられません。

0
Goyuix