Вопрос по android, google-maps-api-3, android-layout – обновление маркера карт google от получателя смс трансляции

3

Я новичок в Android и Java. Я пытаюсь подать заявку для выполнения следующей задачи.

  • receive incoming sms (which will have latitude and longitude information)
  • show them on map with markers So every time an sms comes map should get a new marker.

В настоящее время у меня есть карта, на которой я могу показать точку, и я внедрил приемник вещания, чтобы получать SMS-сообщения о широте и долготе.

Но я не уверен, как обновить карту от широковещательного приемника при получении нового смс.

Любая помощь или советы будут полезны.

Спасибо

Ваш Ответ

2   ответа
5

А. Получи СМС черезBroadcastReceiver

Б. АннотированиеMapView используяItemizedOverlay

C. Сообщите обновления отBroadcastReceiver к деятельности, показывающей карту

Item A: Receive SMS

Implement your BroadcastReceiver class:

public class SMSBroadcastReceiver extends BroadcastReceiver
{
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

    @Override 
    public void onReceive(Context context, Intent intent) 
    {
        if (intent.getAction().equals (SMS_RECEIVED)) 
        {
            Bundle bundle = intent.getExtras();
            if (bundle != null) 
            {
                Object[] pdusData = (Object[])bundle.get("pdus");
                for (int i = 0; i < pdus.length; i++) 
                {
                    SmsMessage message = SmsMessage.createFromPdu((byte[])pdus[i]);

                    /* ... extract lat/long from SMS here */
                }
            }
        }
    }
}

Specify your broadcast receiver in the app manifest:

<manifest ... > 
        <application ... >
                <receiver 
                        android:name=".SMSBroadcastReceiver"
                        android:enabled="true"
                        android:exported="true">
                        <intent-filter>
                                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
                        </intent-filter>
                </receiver>
        </application>
</manifest>

(Кредиты идут на постеры в этой теме:Android - приемник SMS-трансляции)

Item B: Annotate the Map

Create a class derived from ItemizedOverlay, which is used to inform a MapView of any markers which need to be displayed:

class LocationOverlay extends ItemizedOverlay<OverlayItem>
{
        public LocationOverlay(Drawable marker) 
        {         
                /* Initialize this class with a suitable `Drawable` to use as a marker image */

                super( boundCenterBottom(marker));
        }

        @Override     
        protected OverlayItem createItem(int itemNumber) 
        {         
                /* This method is called to query each overlay item. Change this method if
                   you have more than one marker */

                GeoPoint point = /* ... the long/lat from the sms */
                return new OverlayItem(point, null, null);     
        }

   @Override 
   public int size() 
   {
                /* Return the number of markers here */
                return 1; // You only have one point to display
   } 
}

Now, incorporate the overlay into an activity that displays the actual map:

public class CustomMapActivity extends MapActivity 
{     
    MapView map;
    @Override

        public void onCreate(Bundle savedInstanceState) 
        {     
            super.onCreate(savedInstanceState);         
            setContentView(R.layout.main);      

            /* We're assuming you've set up your map as a resource */
            map = (MapView)findViewById(R.id.map);

            /* We'll create the custom ItemizedOverlay and add it to the map */
            LocationOverlay overlay = new LocationOverlay(getResources().getDrawable(R.drawable.icon));
            map.getOverlays().add(overlay);
        }
}
Item C: Communicate the updates

Это самая сложная часть (см. ТакжеОбновление Активности от BroadcastReceiver). Если приложениеMapActivity в настоящее время виден, он должен быть уведомлен о вновь полученных маркерах. ЕслиMapActivity не активен, любые полученные точки должны храниться где-то до тех пор, пока пользователь не решит просмотреть карту.

Define the private intent (in CustomMapActivity):

private final String UPDATE_MAP = "com.myco.myapp.UPDATE_MAP"

Create the private BroadcastReceiver (in CustomMapActivity):

private  BroadcastReceiver updateReceiver =  new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // custom fields where the marker location is stored
        int longitude = intent.getIntExtra("long");
        int latitude = intent.getIntExtra("lat");

        // ... add the point to the `LocationOverlay` ...
        // (You will need to modify `LocationOverlay` if you wish to track more
        // than one location)

        // Refresh the map

        map.invalidate();
    }
}

Register your private BroadcastReceiver when the activity is started (add this to CustomMapActivity.onCreate):

IntentFilter filter = new IntentFilter();
filter.addAction(UPDATE_MAP);
registerReceiver(updateReceiver /* from step 2 */, filter);

Invoke your private intent from the public BroadcastReceiver (add this to SMSBroadcastReceiver.onReceive):

Intent updateIntent = new Intent();
updateIntent.setAction(UPDATE_MAP);
updateIntent.putExtra("long", longitude);
updateIntent.putExtra("lat", latitude);
context.sendBroadcast(updateIntent);
Это зависит от того, как вы передаете данные о местоположении в SMS. Вам нужно будет проанализировать SMS при получении, сохранить данные о местоположении, которые затем используются в ItemizedOverlay.
Самый простой способ освежитьMapView это назвать егоinvalidate метод. Насколько я знаю,ItemizedOverlay не имеет каких-либо автоматических уведомлений об изменениях.
Спасибо за ответ. У меня есть сомнения. Как карта будет меняться в зависимости от местоположения смс? Alok
@TonythePony: я думаю, что вопрос с наложением, как часто он будет обновлять карту? скажем, если смс приходит каждые 5 секунд .. он обновит карту автоматически?
@TonythePony, поэтому вопрос в том, как выполнить недопустимое отображение MapView с приемника вещания, который будет работать в фоновом режиме? Кстати, я работаю с Alok над тем же проектом.
4

вы ищете подробности о том, как общаться между вашей деятельностью и BroadcastReceiver? Один из подходов (существует много разных подходов) состоит в том, чтобы ваша карта Activity регистрировала временный BroadcastReceiver, который настроен на прослушивание только частных трансляций из вашего приложения, а затем ваш получатель SMS-трансляции генерирует новую трансляцию с широтой / долготой из СМС. В вашей карте Активность ваш получатель будет добавлять новую точку на карту каждый раз, когда он получает новую частную трансляцию.

Можете ли вы показать нам код? , Или вы можете объяснить больше. Мой разум в замешательстве. Спасибо за ответ.

Похожие вопросы