這是我目前的工作代碼,這是一個服務,用於通過廣播發送位置。
package maps.custom.com.googlemapsapi;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.hardware.GeomagneticField;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
import android.app.Service;
import com.google.android.gms.maps.model.LatLng;
import java.util.ArrayList;
import java.util.List;
import maps.custom.com.googlemapsapi.support.CNotificationBuilder;
/**
* Created by hackers on 7/12/14.
*/
public class LocationService extends Service
{
public static final String BROADCAST_ACTION = "com.location.service.location";
public static final long DEFAULT_DELAY=1000;
private static final int TWO_MINUTES = 1000 * 60 * 2;
public LocationManager locationManager;
public MyLocationListener listener;
public Location previousBestLocation = null;
Intent intent;
int counter = 0;
@Override
public void onCreate()
{
super.onCreate();
Log.i("Service","create");
intent = new Intent(BROADCAST_ACTION);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("Service","started");
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
listener = new MyLocationListener();
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3*DEFAULT_DELAY, 0, listener); //get updates in every 3 seconds
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3*DEFAULT_DELAY, 0, listener); //get updates in every 3 seconds
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
protected boolean isBetterLocation(Location location, Location currentBestLocation) {
if (currentBestLocation == null) {
// A new location is always better than no location
return true;
}
// Check whether the new location fix is newer or older
long timeDelta = location.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
boolean isNewer = timeDelta > 0;
// If it's been more than two minutes since the current location, use the new location
// because the user has likely moved
if (isSignificantlyNewer) {
return true;
// If the new location is more than two minutes older, it must be worse
} else if (isSignificantlyOlder) {
return false;
}
// Check whether the new location fix is more or less accurate
int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
// Check if the old and new location are from the same provider
boolean isFromSameProvider = isSameProvider(location.getProvider(),
currentBestLocation.getProvider());
// Determine location quality using a combination of timeliness and accuracy
if (isMoreAccurate) {
return true;
} else if (isNewer && !isLessAccurate) {
return true;
} else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
return true;
}
return false;
}
/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
if (provider1 == null) {
return provider2 == null;
}
return provider1.equals(provider2);
}
@Override
public void onDestroy() {
// handler.removeCallbacks(sendUpdatesToUI);
super.onDestroy();
Log.v("STOP_SERVICE", "DONE");
locationManager.removeUpdates(listener);
}
public static Thread performOnBackgroundThread(final Runnable runnable) {
final Thread t = new Thread() {
@Override
public void run() {
try {
runnable.run();
} finally {
}
}
};
t.start();
return t;
}
GeomagneticField geoField;
float heading;
public class MyLocationListener implements LocationListener
{
public void onLocationChanged(final Location loc)
{
Log.i("**************************************", "Location changed");
if(isBetterLocation(loc, previousBestLocation)) {
loc.getLatitude();
loc.getLongitude();
intent.putExtra("Latitude", loc.getLatitude());
intent.putExtra("Longitude", loc.getLongitude());
intent.putExtra("Provider", loc.getProvider());
intent.putExtra("Accuracy", loc.getAccuracy());
intent.putExtra("Speed",loc.getSpeed());
sendBroadcast(intent);
}
public void onProviderDisabled(String provider)
{
Toast.makeText(getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT).show();
}
public void onProviderEnabled(String provider)
{
Toast.makeText(getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show();
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
}
您需要通過下面的代碼
Intent locationservice= new Intent(this,LocationService.class);
startService(locationservice);
接收廣播
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
LatLng temp = new LatLng(extras.getDouble("Latitude"),extras.getDouble("Longitude"));
}
}
到註冊廣播Recever啓動服務。
IntentFilter filter = new IntentFilter();
filter.addAction(LocationService.BROADCAST_ACTION);
registerReceiver(receiver, filter);
使用服務在不使用時會消耗電源停止服務。
更新您的代碼
public class MainFragment extends Fragment{
private SupportMapFragment mSupportMapFragment;
private GoogleMap mGoogleMap;
public BroadcastReceiver receiver=null;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
final LatLng temp = new LatLng(extras.getDouble("Latitude"),extras.getDouble("Longitude"));
if (mGoogleMap != null) {
mGoogleMap.addMarker(new MarkerOptions().position(temp).title("Marker").snippet("Location"));
try {
CameraUpdate center = CameraUpdateFactory.newLatLng(temp);
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15f);
mGoogleMap.moveCamera(center);
mGoogleMap.animateCamera(zoom);
}catch (NumberFormatException e) {
//Some code here for exception
}
}
}
};
FragmentManager mFragmentManager = getChildFragmentManager();
mSupportMapFragment = (SupportMapFragment) mFragmentManager.findFragmentById(R.id.map_container);
if (mSupportMapFragment == null) {
mSupportMapFragment = SupportMapFragment.newInstance();
mFragmentManager.beginTransaction().replace(R.id.map_container, mSupportMapFragment).commit();
}
}
@Override
public void onResume(){
if (mGoogleMap == null) {
mGoogleMap = mSupportMapFragment.getMap();
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false);
mGoogleMap.setMyLocationEnabled(true);
}
//Broadcast/ Filter
IntentFilter filter = new IntentFilter();
filter.addAction(LocationService.BROADCAST_ACTION);
getActivity().registerReceiver(receiver, filter);
}
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
你可以添加錯誤日誌嗎? – Muthu 2015-02-08 18:07:53
@Muthu我在真實的設備上測試過它。我測試了我剛剛編寫的緯度和經度值,並在這種情況下運行。我也嘗試在模擬器中測試,它們具有Google API,但內存出現錯誤。 – 2015-02-08 19:48:17
你好@Muthu我編輯了我的帖子。現在我只看到地圖,它沒有顯示標記和當前位置。請你可以再次檢查帖子的代碼並說出最新的錯誤?感謝,並有一個愉快的一天! – 2015-02-09 09:02:44