Обновление маркера карт google от получателя смс трансляции
Я новичок в Android и Java. Я пытаюсь подать заявку на выполнение следующей задачи.
- получать входящие смс (которые будут иметь информацию о широте и долготе)
- показать их на карте с маркерами Так что каждый раз, когда приходит смс карта должна получить новый маркер.
В настоящее время у меня есть карта, на которой я могу показать точку, и я реализовал широковещательный приемник для получения SMS-сообщения о широте и долготе.
Но я не уверен, как обновить карту от широковещательного приемника при получении нового смс.
Любая помощь или советы будут полезны.
Спасибо
2 ответа
Похоже, вы ищете подробности о том, как общаться между вашей деятельностью и BroadcastReceiver? Один из подходов (существует много разных подходов) состоит в том, чтобы ваша карта Activity регистрировала временный BroadcastReceiver, который настроен на прослушивание только частных трансляций из вашего приложения, а затем ваш получатель SMS-трансляции генерирует новую трансляцию с широтой / долготой из СМС. В вашей карте Активность ваш получатель будет добавлять новую точку на карту каждый раз, когда он получает новую частную трансляцию.
Есть 3 пункта, которые вам нужно адресовать:
А. Получить SMS через BroadcastReceiver
Б. Аннотирование MapView
используя ItemizedOverlay
C. Сообщите обновления от BroadcastReceiver
к деятельности, показывающей карту
Пункт А: Получи СМС
Реализуйте свой
BroadcastReceiver
учебный класс: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 */ } } } } }
Укажите свой широковещательный приемник в манифесте приложения:
<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-трансляции)
Пункт Б: Аннотировать карту
Создать класс, полученный из
ItemizedOverlay
, который используется для информированияMapView
любых маркеров, которые нужно отобразить: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 } }
Теперь включите наложение в действие, которое отображает фактическую карту:
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); } }
Пункт С: Сообщите об обновлениях
Это самая сложная часть (см. Также Обновление действия из BroadcastReceiver). Если приложение MapActivity
в настоящее время виден, он должен быть уведомлен о вновь полученных маркерах. Если MapActivity
не активен, любые полученные баллы нужно где-то хранить, пока пользователь не решит просмотреть карту.
Определите частное намерение (в
CustomMapActivity
):private final String UPDATE_MAP = "com.myco.myapp.UPDATE_MAP"
Создать частный
BroadcastReceiver
(в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(); } }
Зарегистрируй свой личный
BroadcastReceiver
когда действие начинается (добавьте это вCustomMapActivity.onCreate
):IntentFilter filter = new IntentFilter(); filter.addAction(UPDATE_MAP); registerReceiver(updateReceiver /* from step 2 */, filter);
Вызвать ваше личное намерение от общественности
BroadcastReceiver
(добавить это кSMSBroadcastReceiver.onReceive
):Intent updateIntent = new Intent(); updateIntent.setAction(UPDATE_MAP); updateIntent.putExtra("long", longitude); updateIntent.putExtra("lat", latitude); context.sendBroadcast(updateIntent);