2

事前定義された場所の近くにあるときにAndroidからテキストメッセージ(SMS)を送信します。

元。私は大学に入学するか、大学を出て、Androidデバイスが現在の位置を事前定義の位置と一致するかどうかを確認し、デバイスが他の番号に自動SMSを送信します。

どんな仲間もこれに関連するアイデアやコードを持っています..

ありがとうございました..

4

1 に答える 1

3

SMS ユーティリティからコード全体を入れました。sendSms関数を見てください 。このユーティリティを使用すると、着信 SMS を監視し、送信された SMS を追跡できます (そうしたい場合)。

次の部分は、場所の更新を処理することです。それを行う最善の方法は、多くのことに依存します。LocatinProviders (GPS、ワイヤレス、またはパッシブ) を介して位置を取得するか、TelephonyManager からセル情報を読み取ることができます。以下に、それらについての詳細を示します。

  1. ロケーションプロバイダー:

    • 地理緯度/経度データを返します
    • ユーザーが「GPS 衛星を使用する」および「ワイヤレス ネットワークを使用する」を無効にすると、データを読み取ることができません。
    • 建物の中にいる場合 (GPS 信号がない場合) は、むしろデータを取得できません。
    • あなたはその場所を非常に長く待たなければなりません。
    • 非常に良い精度。
    • バッテリーを大量に消耗する可能性があります。
    • "パッシブ" プロバイダーは、適切な選択になる可能性があります。
  2. 細胞。

    • デバイスの隣接セル情報を返します。
    • デバイスが gsm/cdma ネットワークに接続されていない場合 (SIM カードがない場合)、場所は利用できません。
    • 精度は良くありませんが、目的には問題ありません。
    • バッテリーをそれほど消費しません。

どちらのオプションがあなたにとってより良いですか?

   package android.commons;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;

    import android.app.Activity;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.ContentValues;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.Uri;
    import android.os.Bundle;
    import android.telephony.gsm.SmsManager;
    import android.telephony.gsm.SmsMessage;
    import android.util.Log;

    public final class SmsModem extends BroadcastReceiver {

            private static final String SMS_DELIVER_REPORT_ACTION = "android.commons.SMS_DELIVER_REPORT";
            private static final String SMS_DELIVER_REPORT_TOKEN_EXTRA = "token";

            private static final String TAG = SmsModem.class.getSimpleName();
            private final Context context;
            private final SmsManager smsManager;
            private final SmsModemListener listener;

            private final Map<String, Integer> pendingSMS = new HashMap<String, Integer>();

            public interface SmsModemListener {
                    public void onSMSSent(String token);
                    public void onSMSSendError(String token, String errorDetails);
                    public void onNewSMS(String address, String message);
            }

            public SmsModem(Context c, SmsModemListener l) {
                    context = c;
                    listener = l;
                    smsManager = SmsManager.getDefault();
                    final IntentFilter filter = new IntentFilter();
                    filter.addAction(SMS_DELIVER_REPORT_ACTION);
                    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
                    context.registerReceiver(this, filter);         
            }

            public void sendSms(String address, String message, String token) {             
                    if ( message != null && address != null && token != null) {
                            final ArrayList<String> parts = smsManager.divideMessage(message);                      
                            final Intent intent = new Intent(SMS_DELIVER_REPORT_ACTION);
                            intent.putExtra(SMS_DELIVER_REPORT_TOKEN_EXTRA, token);                                         
                            final PendingIntent sentIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                            final ArrayList<PendingIntent> intents = new ArrayList<PendingIntent>();
                            for ( int i = 0 ; i < parts.size() ; i++ ) {
                                    intents.add(sentIntent);
                            }
                            pendingSMS.put(token, parts.size());
                            smsManager.sendMultipartTextMessage(address, null, parts, intents, null);
                    }       
            }

            public void clear() {
                    context.unregisterReceiver(this);
            }

            @Override
            public void onReceive(Context c, Intent intent) {
                    final String action = intent.getAction();
                    if ( action.equalsIgnoreCase("android.provider.Telephony.SMS_RECEIVED")) {
                            final Bundle bundle = intent.getExtras(); 
                if (bundle != null) { 
                        Object[] pdusObj = (Object[]) bundle.get("pdus"); 
                        final SmsMessage[] messages = new SmsMessage[pdusObj.length]; 
                        for (int i = 0; i<pdusObj.length; i++) { 
                            messages[i] = SmsMessage.createFromPdu ((byte[]) pdusObj[i]);
                            final String address = messages[i].getDisplayOriginatingAddress();
                            final String message = messages[i].getDisplayMessageBody();
                            listener.onNewSMS(address, message);
                        } 
                    }
                    } else if ( action.equalsIgnoreCase(SMS_DELIVER_REPORT_ACTION)) {
                            final int resultCode = getResultCode();
                            final String token = intent.getStringExtra(SMS_DELIVER_REPORT_TOKEN_EXTRA);
                            Log.d(TAG, "Deliver report, result code '" + resultCode + "', token '" + token + "'");
                            if ( resultCode == Activity.RESULT_OK ) {
                                    if ( pendingSMS.containsKey(token) ) {
                                            pendingSMS.put(token, pendingSMS.get(token).intValue() - 1);
                                            if ( pendingSMS.get(token).intValue() == 0 ) {
                                                    pendingSMS.remove(token);
                                                    listener.onSMSSent(token);
                                            }
                                    }                               
                            } else {
                                    if ( pendingSMS.containsKey(token) ) {
                                            pendingSMS.remove(token);
                                            listener.onSMSSendError(token, extractError(resultCode, intent));                                       
                                    }
                            }
                    }
            }

            private String extractError(int resultCode, Intent i) {
                    switch ( resultCode ) {
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                            if ( i.hasExtra("errorCode") ) {
                                    return i.getStringExtra("errorCode");
                            } else {
                                    return "Unknown error. No 'errorCode' field.";
                            }
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                            return "No service";                    
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                            return "Radio off";
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                            return "PDU null";
                            default:
                                    return "really unknown error";
                    }
            }
    }
于 2011-05-21T13:42:56.410 に答える