3

私はアンドロイドとJavaの初心者です。次のタスクを実行するアプリケーションを作成しようとしています。

  • 着信 SMS を受信します (緯度と経度の情報が含まれます)
  • マーカー付きのマップ上にそれらを表示するので、SMS が来るたびに、マップは新しいマーカーを取得する必要があります。

現在、ポイントを表示できるマップがあり、SMS から緯度と経度を取得するブロードキャスト レシーバーを実装しています。

しかし、新しいSMSを受信したときにブロードキャストレシーバーからマップを更新する方法がわかりません.

どんなヘルプやヒントも役に立ちます。

ありがとうございました

4

2 に答える 2

5

対処する必要がある項目は 3 つあります。

A. SMS をBroadcastReceiver

B.MapViewを使用して注釈を付けるItemizedOverlay

C. からBroadcastReceiverマップを表示するアクティビティに更新を伝える

項目 A: SMS を受信

  1. 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 */
                    }
                }
            }
        }
    }
    
  2. アプリ マニフェストでブロードキャスト レシーバーを指定します。

    <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 ブロードキャスト受信機)

項目 B: 地図に注釈を付ける

  1. から派生したクラスを作成します。これは、表示する必要があるマーカーを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
       } 
    }
    
  2. 次に、実際の地図を表示するアクティビティにオーバーレイを組み込みます。

    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);
            }
    }
    

項目 C: 最新情報を伝達する

これは最も難しい部分です ( BroadcastReceiver からのアクティビティの更新も参照してください)。アプリMapActivityが現在表示されている場合は、新しく受信したマーカーを通知する必要があります。MapActivityがアクティブでない場合、ユーザーがマップを表示することを選択するまで、受信したポイントをどこかに保存する必要があります。

  1. プライベート インテントを定義します(CustomMapActivity)。

    private final String UPDATE_MAP = "com.myco.myapp.UPDATE_MAP"
    
  2. プライベートを作成します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();
        }
    }
    
  3. BroadcastReceiverアクティビティが開始されたらプライベートを登録します(これを に追加しますCustomMapActivity.onCreate):

    IntentFilter filter = new IntentFilter();
    filter.addAction(UPDATE_MAP);
    registerReceiver(updateReceiver /* from step 2 */, filter);
    
  4. プライベート インテントをパブリックから呼び出しますBroadcastReceiver(これを に追加しますSMSBroadcastReceiver.onReceive):

    Intent updateIntent = new Intent();
    updateIntent.setAction(UPDATE_MAP);
    updateIntent.putExtra("long", longitude);
    updateIntent.putExtra("lat", latitude);
    context.sendBroadcast(updateIntent);
    
于 2012-04-18T19:28:21.217 に答える
4

Activity と BroadcastReceiver の間の通信方法の詳細を探しているようですね。1 つのアプローチ (さまざまなアプローチがあります) は、アプリからのプライベート ブロードキャストのみをリッスンするように設定された一時的な BroadcastReceiver をマップ アクティビティに登録し、SMS ブロードキャスト レシーバーで緯度/経度を使用して新しいブロードキャストを生成することです。 SMS。マップ アクティビティでは、受信機は新しいプライベート ブロードキャストを受信するたびに新しいポイントをマップに追加します。

于 2012-04-18T19:15:24.730 に答える