获取广播接收器/或服务中的GPS位置以广播接收器数据传输
我是新来的android。
我想在广播接收机中获取GPS位置,但是显示错误。
我的代码是:
public void onReceive(Context context, Intent intent) { LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // errors in getSystemService method LocationListener locListener = new MyLocationListener(); locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener); Location loc = locManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); Log.d(" **location**", " location" + loc.getLatitude()); }
问题:
- 广播接收机可以获取GPS位置数据吗?
- 另一种我迄今试过的方法是使用广播接收机调用的服务。 该服务可以获得GPS数据,但我怎样才能得到它在广播接收机?
从BroadcastReceiver我也无法启动位置pipe理器。 所以我在BroadcastReceiver上开始了一个服务,在那个服务中我操作了Location Manager。 我想我在Android开发文档中find了这个解决scheme。 您也可以启动“活动”而不是“服务”。
以下是在BroadcastReceiver上切换到服务的代码:
在onReceive
方法中写这个
Intent serviceIntent = new Intent(context,MyService.class); serviceIntent.putExtra("locateRequest", "locateRequest"); // if you want pass parameter from here to service serviceIntent.putExtra("queryDeviceNumber", results[1]); context.startService(serviceIntent); //start service for get location
是的,他们都是可能的。
你的服务有一个定时器在一段时间内发送请求到位置接收器:
public class SrvPositioning extends Service { // An alarm for rising in special times to fire the // pendingIntentPositioning private AlarmManager alarmManagerPositioning; // A PendingIntent for calling a receiver in special times public PendingIntent pendingIntentPositioning; @Override public void onCreate() { super.onCreate(); alarmManagerPositioning = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intentToFire = new Intent( ReceiverPositioningAlarm.ACTION_REFRESH_SCHEDULE_ALARM); intentToFire.putExtra(ReceiverPositioningAlarm.COMMAND, ReceiverPositioningAlarm.SENDER_SRV_POSITIONING); pendingIntentPositioning = PendingIntent.getBroadcast(this, 0, intentToFire, 0); }; @Override public void onStart(Intent intent, int startId) { try { long interval = 60 * 1000; int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; long timetoRefresh = SystemClock.elapsedRealtime(); alarmManagerPositioning.setInexactRepeating(alarmType, timetoRefresh, interval, pendingIntentPositioning); } catch (NumberFormatException e) { Toast.makeText(this, "error running service: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(this, "error running service: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } } @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onDestroy() { this.alarmManagerPositioning.cancel(pendingIntentPositioning); ReceiverPositioningAlarm.stopLocationListener(); } }
你的接收器与一个监听器。 监听器可以在您的活动中使用,以通知您新的位置已准备就绪:
public class ReceiverPositioningAlarm extends BroadcastReceiver { public static final String COMMAND = "SENDER"; public static final int SENDER_ACT_DOCUMENT = 0; public static final int SENDER_SRV_POSITIONING = 1; public static final int MIN_TIME_REQUEST = 5 * 1000; public static final String ACTION_REFRESH_SCHEDULE_ALARM = "org.mabna.order.ACTION_REFRESH_SCHEDULE_ALARM"; private static Location currentLocation; private static Location prevLocation; private static Context _context; private String provider = LocationManager.GPS_PROVIDER; private static Intent _intent; private static LocationManager locationManager; private static LocationListener locationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras){ try { String strStatus = ""; switch (status) { case GpsStatus.GPS_EVENT_FIRST_FIX: strStatus = "GPS_EVENT_FIRST_FIX"; break; case GpsStatus.GPS_EVENT_SATELLITE_STATUS: strStatus = "GPS_EVENT_SATELLITE_STATUS"; break; case GpsStatus.GPS_EVENT_STARTED: strStatus = "GPS_EVENT_STARTED"; break; case GpsStatus.GPS_EVENT_STOPPED: strStatus = "GPS_EVENT_STOPPED"; break; default: strStatus = String.valueOf(status); break; } Toast.makeText(_context, "Status: " + strStatus, Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onProviderEnabled(String provider) {} @Override public void onProviderDisabled(String provider) {} @Override public void onLocationChanged(Location location) { try { Toast.makeText(_context, "***new location***", Toast.LENGTH_SHORT).show(); gotLocation(location); } catch (Exception e) { } } }; // received request from the calling service @Override public void onReceive(final Context context, Intent intent) { Toast.makeText(context, "new request received by receiver", Toast.LENGTH_SHORT).show(); _context = context; _intent = intent; locationManager = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); if (locationManager.isProviderEnabled(provider)) { locationManager.requestLocationUpdates(provider, MIN_TIME_REQUEST, 5, locationListener); Location gotLoc = locationManager .getLastKnownLocation(provider); gotLocation(gotLoc); } else { Toast t = Toast.makeText(context, "please turn on GPS", Toast.LENGTH_LONG); t.setGravity(Gravity.CENTER, 0, 0); t.show(); Intent settinsIntent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); settinsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); _context.startActivity(settinsIntent); } } private static void gotLocation(Location location) { prevLocation = currentLocation == null ? null : new Location( currentLocation); currentLocation = location; if (isLocationNew()) { OnNewLocationReceived(location); Toast.makeText(_context, "new location saved", Toast.LENGTH_SHORT).show(); stopLocationListener(); } } private static boolean isLocationNew() { if (currentLocation == null) { return false; } else if (prevLocation == null) { return true; } else if (currentLocation.getTime() == prevLocation.getTime()) { return false; } else { return true; } } public static void stopLocationListener() { locationManager.removeUpdates(locationListener); Toast.makeText(_context, "provider stoped", Toast.LENGTH_SHORT) .show(); } // listener ---------------------------------------------------- static ArrayList<OnNewLocationListener> arrOnNewLocationListener = new ArrayList<OnNewLocationListener>(); // Allows the user to set a OnNewLocationListener outside of this class // and react to the event. // A sample is provided in ActDocument.java in method: startStopTryGetPoint public static void setOnNewLocationListener( OnNewLocationListener listener) { arrOnNewLocationListener.add(listener); } public static void clearOnNewLocationListener( OnNewLocationListener listener) { arrOnNewLocationListener.remove(listener); } // This function is called after the new point received private static void OnNewLocationReceived(Location location) { // Check if the Listener was set, otherwise we'll get an Exception // when we try to call it if (arrOnNewLocationListener != null) { // Only trigger the event, when we have any listener for (int i = arrOnNewLocationListener.size() - 1; i >= 0; i--) { arrOnNewLocationListener.get(i).onNewLocationReceived( location); } } } }
监听器的接口:
import android.location.Location; public interface OnNewLocationListener { public abstract void onNewLocationReceived(Location location); }
在你的活动中获得一点:
protected void btnGetPoint_onClick() { Intent intentToFire = new Intent( ReceiverPositioningAlarm.ACTION_REFRESH_SCHEDULE_ALARM); intentToFire.putExtra(ReceiverPositioningAlarm.COMMAND, ReceiverPositioningAlarm.SENDER_ACT_DOCUMENT); sendBroadcast(intentToFire); OnNewLocationListener onNewLocationListener = new OnNewLocationListener() { @Override public void onNewLocationReceived(Location location) { // use your new location here then stop listening ReceiverPositioningAlarm.clearOnNewLocationListener(this); } }; // start listening for new location ReceiverPositioningAlarm .setOnNewLocationListener(onNewLocationListener); }
编辑:
如果你想在你的活动中开始服务:
this.startService(new Intent(this, SrvPositioning.class));
同样,您可以在您的服务中定义一个侦听器来接收接收方发现的位置
编辑
在清单中添加以下行
<service android:name="org.mabna.order.services.SrvPositioning" android:enabled="true" /> <receiver android:name="org.mabna.order.receivers.ReceiverPositioningAlarm" > <!-- this Broadcast Receiver only listens to the following intent --> <intent-filter> <action android:name="org.mabna.order.ACTION_REFRESH_SCHEDULE_ALARM" /> </intent-filter> </receiver>
第1 步 :打开AndroidManifest.xml并添加广播接收器。
<receiver android:name=".Util.GpsConnectorReceiver" android:enabled="true"> <intent-filter> <!-- Intent filters for broadcast receiver --> <action android:name="android.location.PROVIDERS_CHANGED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>`
第2步:用对话框主题创build活动:
<activity android:name=".Activity.ActivityDialogGps" android:theme="@style/AppTheme.Dark.Dialog"></activity>
第3 步 :制作一个名为GpsConnectorReceiver的BroadcastReceiver类
public class GpsConnectorReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) { Intent pushIntent = new Intent(context, ConnectivityCheck .class); context.startService(pushIntent); } }}
第4步:创build另一个名为ConnectivityCheck的服务类:
public class ConnectivityCheck extends Service { @Override public void onCreate() { super.onCreate(); if (!checkConnection()) { Toast.makeText(context, "off", Toast.LENGTH_LONG).show(); Intent dialogIntent = new Intent(this, ActivityDialogInternet.class); dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(dialogIntent); } stopSelf(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } private boolean checkConnection() { final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); return manager.isProviderEnabled(LocationManager.GPS_PROVIDER); }}
第5步:创build一个名为ActivityDialogGps的活动
public class ActivityDialogGps extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dialog_gps); }}
第6步:当Gps连接closures时, ActivityDialogGps调用并显示对话框: