手机重启后是否可以进行后台位置更新?

时间:2018-04-16 06:11:18

标签: android background location google-play updates

使用Google Play服务更新后台位置...

在后台每5分钟成功更新一次位置信息。

但是,也许并不奇怪,如果重启设备,则更新停止。

是否可以在手机重启后继续进行后台位置更新...如果是,怎么做?

如果有帮助,这里是现有代码:

import android.os.Bundle;

import java.util.ArrayList;

public class GPSTracker extends Service implements
        GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener {
    protected static final String TAG = "Location...";
    private Context mContext = this;


    /**
     * Tracks the status of the location updates request.
     */
    public static Boolean mRequestingLocationUpdates;
    /**
     * Time when the location was updated represented as a String.
     */
    protected String mLastUpdateTime;
    /**
     * Provides the entry point to Google Play services.
     */
    protected GoogleApiClient mGoogleApiClient;
    /**
     * Stores parameters for requests to the FusedLocationProviderApi.
     */
    protected LocationRequest mLocationRequest;

    /**
     * Represents a geographical location.
     */
    protected Location mCurrentLocation;
    public static boolean isEnded = false;


    @Override
    public void onCreate() {
        super.onCreate();

        buildGoogleApiClient();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.d("LOC", "Service init...");
        isEnded = false;
        mRequestingLocationUpdates = false;
        mLastUpdateTime = "";
        // buildGoogleApiClient();
        if (mGoogleApiClient.isConnected() && mRequestingLocationUpdates) {
            startLocationUpdates();
        }
        return START_STICKY;
    }


    @Override
    public void onConnected(Bundle bundle) {

        startLocationUpdates();
    }

    @Override
    public void onConnectionSuspended(int i) {
        // The connection to Google Play services was lost for some reason. We call connect() to
        // attempt to re-establish the connection.
        Log.i(TAG, "Connection suspended==");
        mGoogleApiClient.connect();
    }

    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();

        StringBuilder stringBuilder = new StringBuilder();
        StringBuilder latlong = stringBuilder.append(latitude + "," + longitude);

        Calendar cal = Calendar.getInstance();
        String zone = TimeZone.getDefault().getDisplayName(false, android.icu.util.TimeZone.SHORT);
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM 'at' h:mm a");
        Date date = new Date();
        String localtime = (formatter.format(date)).toString();

        Date myDate = new Date();

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
        calendar.setTime(myDate);
        date = calendar.getTime();
        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss zz");
        dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
        String utc = dateFormatter.format(date);

        //  DateFormat df = DateFormat.getTimeInstance();
        //  df.setTimeZone(TimeZone.getTimeZone("gmt"));
        //  String gmtTime = df.format(new Date());

        String model = Build.MODEL;

        String reqString = Build.VERSION.RELEASE
                + " " + Build.VERSION_CODES.class.getFields()[android.os.Build.VERSION.SDK_INT].getName();

        // Date currentTime = Calendar.getInstance().getTime();
        // String localtime = currentTime.toString();

        PreferencesClass preferencesClass = new PreferencesClass(mContext);
        String id = preferencesClass.getFingerPrint();

        Data data = null;
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("userId", id);
            jsonObject.put("latLon", latlong);
            jsonObject.put("timeZone", zone);
            jsonObject.put("localTime", localtime);
            jsonObject.put("osVersion", reqString);
            jsonObject.put("phoneModel", model);
            jsonObject.put("utcTime", utc);
            data = new Data();
            data.setData(jsonObject.toString());

            if (data != null) {

                if (Utility.isConnectingToInternet(mContext)) {

                    // boolean isChecked = preferencesClass.getIsChecked();
                    //  if (isChecked){

                    LocationWebServiceMgr locationWebServiceMgr = new LocationWebServiceMgr();
                    locationWebServiceMgr.Location(data, new CallBackInterface() {
                        @Override
                        public void onResponse(ArrayList<Object> objects, ResponseMetaData responseMetaData) {

                            Log.d(TAG, "onResponse: Succesfully added the location to server");
                            // Toast.makeText(getApplicationContext(), "added to server", Toast.LENGTH_LONG).show();
                        }

                        @Override
                        public void onFailure(ResponseMetaData t) {
                        }
                    });

                    // } else {
                    //   Log.d("serverCall", "Location Permission not available ");

                    //  }

                } else {

                    Log.e("serverCall", "Network not available");

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        // Refer to the javadoc for ConnectionResult to see what error codes might be returned in
        // onConnectionFailed.
        Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + connectionResult.getErrorCode());
    }

    /**
     * Builds a GoogleApiClient. Uses the {@code #addApi} method to request the
     * LocationServices API.
     */
    protected synchronized void buildGoogleApiClient() {
        Log.i(TAG, "Building GoogleApiClient===");
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        createLocationRequest();
    }

    /**
     * Sets up the location request. Android has two location request settings:
     * {@code ACCESS_COARSE_LOCATION} and {@code ACCESS_FINE_LOCATION}. These settings control
     * the accuracy of the current location. This sample uses ACCESS_FINE_LOCATION, as defined in
     * the AndroidManifest.xml.
     * <p/>
     * When the ACCESS_FINE_LOCATION setting is specified, combined with a fast update
     * interval (5 seconds), the Fused Location Provider API returns location updates that are
     * accurate to within a few feet.
     * <p/>
     * These settings are appropriate for mapping applications that show real-time location
     * updates.
     */
    protected void createLocationRequest() {
        mGoogleApiClient.connect();
        mLocationRequest = new LocationRequest();

        // Sets the desired interval for active location updates. This interval is
        // inexact. You may not receive updates at all if no location sources are available, or
        // you may receive them slower than requested. You may also receive updates faster than
        // requested if other applications are requesting location at a faster interval.
        mLocationRequest.setInterval(Constants.UPDATE_INTERVAL_IN_MILLISECONDS);

        // Sets the fastest rate for active location updates. This interval is exact, and your
        // application will never receive updates faster than this value.
        mLocationRequest.setFastestInterval(Constants.FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);

        // mLocationRequest.setSmallestDisplacement(Constants.DISPLACEMENT);

        //mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    /**
     * Requests location updates from the FusedLocationApi.
     */
    protected void startLocationUpdates() {
        if (!mRequestingLocationUpdates) {
            mRequestingLocationUpdates = true;

            // The final argument to {@code requestLocationUpdates()} is a LocationListener
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            LocationServices.FusedLocationApi.requestLocationUpdates(
                    mGoogleApiClient, mLocationRequest, this);
            Log.i(TAG, " startLocationUpdates===");
            isEnded = true;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我处理如下,它对你有帮助

<强> RestartReceiver:

public class RestartReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    try {
        //started service for update the location of userx
        LocationsUpdateRequest.createLocationRequest(context);
      //updated in my preference because I need to send data to server if user signed in app only


    } catch (Exception e) {
        LogUtils.crashlytics(e);
    }
  }
}

<强> ShutdownReceiver:

public class ShutdownReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    try {
        //stop the service when phone is shotdown
           LocationsUpdateRequest.getPendingIntent(context).cancel();
      //reset flag in preference
    } catch (Exception e) {

    }
}
}

清单:

 <receiver android:name=".services.ShutdownReceiver">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_SHUTDOWN" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.QUICKBOOT_POWEROFF" />
        </intent-filter>
    </receiver>
    <receiver android:name=".services.RestartReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>