Как отправлять текстовые сообщения (SMS) с Android, когда рядом с предопределенным местоположением - PullRequest
2 голосов
/ 21 мая 2011

Отправка текстовых сообщений (SMS) с Android, когда рядом с заданным местоположением ...

Ex. я вхожу в колледж или из колледжа в то время, когда мое устройство Android проверяет мою текущую позицию, если она совпадает с предопределенной позицией, тогда мое устройство отправляет автоматические смс другим "нет".

У любого собеседника есть идея или код, связанный с этим ..

спасибо ..

1 Ответ

3 голосов
/ 21 мая 2011

Я положил весь код из моего утилиты SMS.Вы должны взглянуть на функцию sendSms .Утилита позволяет вам следить за входящими смс и отслеживать отправленные вами смс (если вы хотите это сделать).

Следующая часть предназначена для обработки обновлений местоположения.Лучший способ, как это сделать, зависит от многих вещей.Вы можете получить местоположение через LocatinProviders (GPS, беспроводной или пассивный) или прочитать информацию о ячейке из TelephonyManager.Ниже у вас есть некоторые подробности о них:

  1. LocationProvider:

    • возвращает данные географической широты / долготы
    • вы не можете прочитать данные, если пользовательотключено «Использовать спутники GPS» и «Пользовательские беспроводные сети»
    • Вы, скорее всего, не получите данные, если находитесь в здании (там нет сигнала GPS).
    • вам придется ждать очень долго
    • очень хорошая точность.
    • может сильно разряжать батарею.
    • " pasive " поставщик может быть хорошим выбором для вас.
  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";
                    }
            }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...