LocationListenerの傍受位置が変化し、ある距離に入ると注意を出す
8421 ワード
プロジェクトでは、次のような要件が必要です.
サービスを開始すると、現在の位置の変化を背後で監視し、ある場所からnキロ離れた場所に入ると、Notificationを発行してユーザーの近くに何があるかを注意します.
ここで私が採用した戦略はこうです.
まずネットワークを傍受し、ネットワークに接続されている場合は距離傍受サービスを開始し、そうでない場合は距離傍受サービスをオフにします.ネットが切れたら、距離の変化は何ですか?
次に、ネットワークリスニングを開始する必要があるかどうかは、距離リスニングサービスを開始したことに等しい.
3つ目は、ある範囲に入ると、すぐに距離傍受サービスをオフにします.そうしないと、注意が絶えず、ユーザーはうんざりします.
以上の手順に基づいて、まず距離リスニングサービスを実現します.
インターネットの傍受サービス、実は1つの放送を登録して、携帯電話のCONNECTIVE_を傍受しますACTION動作でOK
必要に応じて起動
以上のサービス、BroadcastReceiverは登録が必要で、ネットワーク権限などを加えます
サービスを開始すると、現在の位置の変化を背後で監視し、ある場所からnキロ離れた場所に入ると、Notificationを発行してユーザーの近くに何があるかを注意します.
ここで私が採用した戦略はこうです.
まずネットワークを傍受し、ネットワークに接続されている場合は距離傍受サービスを開始し、そうでない場合は距離傍受サービスをオフにします.ネットが切れたら、距離の変化は何ですか?
次に、ネットワークリスニングを開始する必要があるかどうかは、距離リスニングサービスを開始したことに等しい.
3つ目は、ある範囲に入ると、すぐに距離傍受サービスをオフにします.そうしないと、注意が絶えず、ユーザーはうんざりします.
以上の手順に基づいて、まず距離リスニングサービスを実現します.
package com.mobovip.app;
import java.text.DecimalFormat;
import java.util.ArrayList;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class LocationService extends Service{
private Context context;
public static ArrayList<Store> stores=new ArrayList<Store>();
public static double distance = 3;//7430km
private LocationManager locationManager;
private NotificationManager notificationManager;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
context = this;
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
// if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
// locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 1f, locationListener);
// }else{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000, 1f,locationListener);
// }
// Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
// if(location != null){
// checkDistance(location);
// }
}
private final LocationListener locationListener = new LocationListener() {
// , Provider ,
public void onLocationChanged(Location location) {
// log it when the location changes
if (location != null) {
checkDistance(location);
}
}
// Provider disable , GPS
public void onProviderDisabled(String provider) {
}
// Provider enable , GPS
public void onProviderEnabled(String provider) {
}
// Provider 、
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
@Override
public void onDestroy() {
super.onDestroy();
if(locationManager!=null){
locationManager.removeUpdates(locationListener);
locationManager=null;
}
}
private void checkDistance(Location location) {
if (location != null) {
float[] results = new float[1];
for (Store store : stores) {
Location.distanceBetween(location.getLatitude(),
location.getLongitude(), store.getLatitude(),
store.getLongitude(), results);
float result=(results[0] / 1000);//km
if (result < distance) {
showNotification(store);
stopSelf();//
break;
}
}
}
}
private static final int NOTIFY_ID = 0;
private void showNotification(Store store) {
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent intent = new Intent(this, BGR.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);// FLAG_ONE_SHOT
Notification notification = new Notification.Builder(context)
.setTicker(context.getString(R.string.app_name, ""))
.setContentTitle(store.getStoreName()+"("+store.getDistance()+")")
.setContentText(store.getStoreAddress())
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_launch_notify)
.setAutoCancel(true)
.setWhen(System.currentTimeMillis())
.setDefaults(Notification.DEFAULT_ALL)
.getNotification();
notificationManager.notify(NOTIFY_ID, notification);
}
}
インターネットの傍受サービス、実は1つの放送を登録して、携帯電話のCONNECTIVE_を傍受しますACTION動作でOK
package com.mobovip.app;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
public class NetworkStateService extends Service {
private static final String tag = "tag";
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {
Intent service = new Intent(context, LocationService.class);
startService(service);
} else {
Intent service = new Intent(context, LocationService.class);
stopService(service);
}
}
}
};
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mReceiver, mFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}
必要に応じて起動
package com.mobovip.app;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* BootReceiver
*
* @author NGJ
*
*/
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Intent i = new Intent(context, NetworkStateService.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(i);
}
}
以上のサービス、BroadcastReceiverは登録が必要で、ネットワーク権限などを加えます
<service android:enabled="true" android:name="com.mobovip.app.NetworkStateService" />
<service android:enabled="true" android:name="com.mobovip.app.LocationService" />
<!--
<receiver android:name="com.mobovip.app.BootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
-->