如何将android设备中的位置发送到服务器(php)automaticlly

时间:2015-12-20 06:58:43

标签: service server job-scheduling

我必须自动从Android设备向服务器(php)发送位置(纬度和经度)(每2分钟) 对于这项工作,我使用JobSchedulerCompat来发送位置服务。 但是在此之后,只有在应用程序运行后才将位置发送到服务器,我希望将位置连续发送到服务器。

我怎样才能做到这一点?

到目前为止,这是我的代码:

GpsTracker.java

public class GPSTracker extends Service {

    private final Context mContext;

    boolean isGPSEnabled = false;

    boolean isNetworkEnabled = false;

    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }


    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);
            isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
            try {
                isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            }catch (Exception ex){
                ex.printStackTrace();
            }


            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;

                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListenerNetwork);

                    Toast.makeText(mContext,"Network Enabled",Toast.LENGTH_SHORT).show();
                    if (locationManager != null) {
                        location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }

                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListenerGps);
                        //Log.d("GPS Enabled", "GPS Enabled");
                        Toast.makeText(mContext,"GPS Enabled",Toast.LENGTH_SHORT).show();
                        if (locationManager != null) {
                            location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

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

        return location;
    }


    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(locationListenerGps);
        }
    }

    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        return latitude;
    }

    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        return longitude;
    }

    public boolean canGetLocation() {
        return this.canGetLocation;
    }


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

MyService.java

public class MyService extends JobService{

    String code;

    @Override
        public boolean onStartJob(JobParameters params) {
            code=readsavefile(getApplicationContext(),"Code2","Error");
            //Toast.makeText(getApplicationContext(),code,Toast.LENGTH_SHORT).show();
            new SendLocation(this,params,getApplicationContext()).execute(code);
            //Toast.makeText(getApplicationContext(),"Start",Toast.LENGTH_SHORT).show();
            //jobFinished(params, false);
            return true;
        }

    public static String readsavefile(Context context,String pname,String dvalue){
        SharedPreferences shared=context.getSharedPreferences("GetCodeService", Context.MODE_PRIVATE);
        return shared.getString(pname,dvalue);
    }

    @Override
        public boolean onStopJob(JobParameters params) {
            return false;
        }

    private static class SendLocation extends AsyncTask<String, Void, String> {
        MyService myService;
        JobParameters jobParameters;
        Context _context;
        GPSTracker gps;
        double lat,lon;
        public SendLocation(MyService myService,JobParameters jobParameters,Context context){
            this._context=context;
            gps=new GPSTracker(context);
            if (gps.canGetLocation){
                lat=gps.getLatitude();
                lon=gps.getLongitude();
            }
            this.myService=myService;
            this.jobParameters=jobParameters;
        }
        @Override
            protected void onPreExecute() {

                super.onPreExecute();
            }

        @Override
            protected String doInBackground(String... strings) {
                String link = Config.IP_Config + "Hatef/getlocation.php";
                HttpClient httpclint = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(link);
                try {
                    JSONObject jsonobj = new JSONObject();
                    jsonobj.put("latitude", lat+"");
                    jsonobj.put("longitude", lon+"");
                    jsonobj.put("code", strings[0]);
                    List<NameValuePair> namevaluepair = new ArrayList<NameValuePair>();
                    namevaluepair.add(new BasicNameValuePair("req", jsonobj.toString()));
                    httppost.setEntity(new UrlEncodedFormEntity(namevaluepair, HTTP.UTF_8));
                    HttpResponse response = httpclint.execute(httppost);
                    InputStream inputstream = response.getEntity().getContent();

                    BufferedReader br = null;
                    StringBuilder sb = new StringBuilder();
                    String line;

                    try {
                        br = new BufferedReader(new InputStreamReader(inputstream));
                        while ((line = br.readLine()) != null) {
                            sb.append(line);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    return sb.toString();
                } catch (Exception ex) {
                    ex.printStackTrace();
                    return null;
                }
            }

        @Override
            protected void onPostExecute(String s) {
                myService.jobFinished(jobParameters, false);
            }
    }
}

运行服务

JobInfo.Builder builder=new JobInfo.Builder(100,new ComponentName(this,MyService.class));

    builder.setPeriodic(10000)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
            .setPersisted(true);

    mJobScheduler.schedule(builder.build());

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher2"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".Main"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".second_page"
        android:screenOrientation="portrait" >
    </activity>

<service android:name=".MyService"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="true"
    />
</application>

0 个答案:

没有答案