MockGpsService.java 15.4 KB
Newer Older
V
Vergil 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
package com.example.service;

import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.view.Gravity;
import android.widget.Toast;

import com.baidu.mapapi.model.LatLng;
N
1.9.5  
NeroZhang 已提交
30
import com.example.log4j.LogUtil;
V
Vergil 已提交
31 32
import com.example.mockgps.R;

N
1.9.5  
NeroZhang 已提交
33 34
import org.apache.log4j.Logger;

N
NeroZhang 已提交
35
import java.util.List;
V
Vergil 已提交
36 37 38 39 40 41 42 43 44 45 46
import java.util.UUID;

public class MockGpsService extends Service {


    private String TAG = "MockGpsService";

    private LocationManager locationManager;
    private HandlerThread handlerThread;
    private Handler handler;

N
NeroZhang 已提交
47
    private boolean isStop = true;
V
Vergil 已提交
48 49

    //经纬度字符串
N
NeroZhang 已提交
50
    private String latLngInfo = "104.06121778639009&30.544111926165282";
V
Vergil 已提交
51 52 53

    //悬浮窗
    private FloatWindow floatWindow;
N
NeroZhang 已提交
54
    private boolean isFloatWindowStart = false;
V
Vergil 已提交
55 56


N
NeroZhang 已提交
57 58
    public static final int RunCode = 0x01;
    public static final int StopCode = 0x02;
V
Vergil 已提交
59

N
1.9.5  
NeroZhang 已提交
60 61
    //log debug
    private static Logger log = Logger.getLogger(MockGpsService.class);
V
Vergil 已提交
62 63 64 65 66 67 68 69 70 71

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

    @SuppressLint("WrongConstant")
    @Override
    public void onCreate() {
N
1.9.5  
NeroZhang 已提交
72
        LogUtil.configLog();
V
Vergil 已提交
73
        Log.d(TAG, "onCreate");
N
NeroZhang 已提交
74
        log.debug(TAG + ": onCreate");
V
Vergil 已提交
75
        super.onCreate();
N
NeroZhang 已提交
76
        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
V
Vergil 已提交
77

N
NeroZhang 已提交
78 79
        //for test
        getProviders();
V
Vergil 已提交
80
        //remove default network location provider
N
NeroZhang 已提交
81 82 83
        rmNetworkTestProvider();
        //remove gps provider
        rmGPSTestProvider();
N
1.9.5  
NeroZhang 已提交
84

N
NeroZhang 已提交
85 86 87 88
        //add a new test network location provider
        setNetworkTestProvider();
//        add a GPS test Provider
        setGPSTestProvider();
N
1.9.5  
NeroZhang 已提交
89

V
Vergil 已提交
90
        //thread
N
NeroZhang 已提交
91
        handlerThread = new HandlerThread(getUUID(), -2);
V
Vergil 已提交
92 93
        handlerThread.start();

N
NeroZhang 已提交
94 95
        handler = new Handler(handlerThread.getLooper()) {
            public void handleMessage(Message msg) {
V
Vergil 已提交
96
                try {
N
NeroZhang 已提交
97 98
                    Thread.sleep(128);
                    if (!isStop) {
N
1.9.5  
NeroZhang 已提交
99 100 101 102 103 104 105

                        //remove default network location provider
                        //rmNetworkProvider();

                        //add a new network location provider
                        //setNewNetworkProvider();

N
NeroZhang 已提交
106 107
                        setTestProviderLocation();
                        setGPSLocation();
V
Vergil 已提交
108 109
                        sendEmptyMessage(0);
                        //broadcast to MainActivity
N
NeroZhang 已提交
110
                        Intent intent = new Intent();
V
Vergil 已提交
111 112 113 114 115 116
                        intent.putExtra("statusCode", RunCode);
                        intent.setAction("com.example.service.MockGpsService");
                        sendBroadcast(intent);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
N
1.9.5  
NeroZhang 已提交
117
                    Log.d(TAG, "handleMessage error");
N
NeroZhang 已提交
118
                    log.debug(TAG + ": handleMessage error");
V
Vergil 已提交
119 120 121 122 123 124 125 126 127 128 129
                    Thread.currentThread().interrupt();
                }
            }
        };
        handler.sendEmptyMessage(0);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.d(TAG, "onStart");
N
NeroZhang 已提交
130
        log.debug(TAG + ": onStart");
V
Vergil 已提交
131 132 133 134 135 136
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
N
NeroZhang 已提交
137
        log.debug(TAG + ": onStartCommand");
V
Vergil 已提交
138 139 140 141
//        DisplayToast("Mock Location Service Start");
        //

        String channelId = "channel_01";
N
NeroZhang 已提交
142
        String name = "channel_name";
V
Vergil 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel mChannel = new NotificationChannel(channelId, name, NotificationManager.IMPORTANCE_LOW);
            Log.i(TAG, mChannel.toString());
            if (notificationManager != null) {
                notificationManager.createNotificationChannel(mChannel);
            }
            notification = new Notification.Builder(this)
                    .setChannelId(channelId)
                    .setContentTitle("位置模拟服务已启动")
                    .setContentText("MockLocation service is running")
                    .setSmallIcon(R.mipmap.ic_launcher).build();
        } else {
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                    .setContentTitle("位置模拟服务已启动")
                    .setContentText("MockLocation service is running")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setOngoing(true)
                    .setChannelId(channelId);//无效
            notification = notificationBuilder.build();
        }
N
NeroZhang 已提交
165
        startForeground(1, notification);
V
Vergil 已提交
166 167 168
        //

        //get location info from mainActivity
N
NeroZhang 已提交
169 170 171
        latLngInfo = intent.getStringExtra("key");
        Log.d(TAG, "DataFromMain is " + latLngInfo);
        log.debug(TAG + ": DataFromMain is " + latLngInfo);
V
Vergil 已提交
172
        //start to refresh location
N
NeroZhang 已提交
173
        isStop = false;
V
Vergil 已提交
174 175

        //这里开启悬浮窗
N
NeroZhang 已提交
176 177
        if (!isFloatWindowStart) {
            floatWindow = new FloatWindow(this);
V
Vergil 已提交
178
            floatWindow.showFloatWindow();
N
NeroZhang 已提交
179
            isFloatWindowStart = true;
V
Vergil 已提交
180 181 182 183 184 185 186 187 188 189
        }


//        return START_STICKY;
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
N
NeroZhang 已提交
190
        log.debug(TAG + ": onDestroy");
V
Vergil 已提交
191 192 193
//        Toast.makeText(this, "Service destroyed", Toast.LENGTH_SHORT).show();

//        DisplayToast("Mock Loction Service finish");
N
NeroZhang 已提交
194
        isStop = true;
V
Vergil 已提交
195 196 197

        //移除悬浮窗
        floatWindow.hideFloatWindow();
N
NeroZhang 已提交
198
        isFloatWindowStart = false;
V
Vergil 已提交
199 200 201

        handler.removeMessages(0);
        handlerThread.quit();
N
NeroZhang 已提交
202 203 204 205

        //remove test provider
        rmNetworkTestProvider();
        rmGPSTestProvider();
V
Vergil 已提交
206

N
1.9.5  
NeroZhang 已提交
207
        //rmGPSProvider();
V
Vergil 已提交
208 209 210
        stopForeground(true);

        //broadcast to MainActivity
N
NeroZhang 已提交
211
        Intent intent = new Intent();
V
Vergil 已提交
212 213 214 215 216 217 218
        intent.putExtra("statusCode", StopCode);
        intent.setAction("com.example.service.MockGpsService");
        sendBroadcast(intent);

        super.onDestroy();
    }

N
NeroZhang 已提交
219 220 221 222 223 224 225 226
    //provider test
    public void getProviders() {
        List<String> providerList = locationManager.getProviders(true);
        for (String str : providerList) {
            Log.d("PROV", str);
            log.debug("active provider: " + str);
        }
    }
V
Vergil 已提交
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253

    //generate a location
    public Location generateLocation(LatLng latLng) {
        Location loc = new Location("gps");


        loc.setAccuracy(2.0F);
        loc.setAltitude(55.0D);
        loc.setBearing(1.0F);
        Bundle bundle = new Bundle();
        bundle.putInt("satellites", 7);
        loc.setExtras(bundle);


        loc.setLatitude(latLng.latitude);
        loc.setLongitude(latLng.longitude);
//        loc.setAccuracy(1.0F);
//        loc.setAltitude(10);
//        loc.setBearing(90);
        loc.setTime(System.currentTimeMillis());
        if (Build.VERSION.SDK_INT >= 17) {
            loc.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
        }
//        Log.d("WATCH",loc.toString());
        return loc;
    }

N
NeroZhang 已提交
254 255
    //给test provider添加网络定位
    private void setTestProviderLocation() {
V
Vergil 已提交
256
        //default location 30.5437233 104.0610342 成都长虹科技大厦
N
NeroZhang 已提交
257 258 259
        Log.d(TAG, "setNetworkLocation: " + latLngInfo);
        log.debug(TAG + ": setNetworkLocation: " + latLngInfo);
        String latLngStr[] = latLngInfo.split("&");
V
Vergil 已提交
260 261
        LatLng latLng = new LatLng(Double.valueOf(latLngStr[1]), Double.valueOf(latLngStr[0]));
        String providerStr = LocationManager.NETWORK_PROVIDER;
N
1.9.5  
NeroZhang 已提交
262
//        String providerStr2 = LocationManager.GPS_PROVIDER;
V
Vergil 已提交
263 264
        try {
            locationManager.setTestProviderLocation(providerStr, generateLocation(latLng));
N
1.9.5  
NeroZhang 已提交
265
//            locationManager.setTestProviderLocation(providerStr2, generateLocation(latLng));
V
Vergil 已提交
266 267 268 269
            //for test
//            locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, generateLocation(latLng));
        } catch (Exception e) {
            Log.d(TAG, "setNetworkLocation error");
N
NeroZhang 已提交
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
            log.debug(TAG + ": setNetworkLocation error");
            e.printStackTrace();
        }
    }

    //set gps location
    private void setGPSLocation(){
        //default location 30.5437233 104.0610342 成都长虹科技大厦
        Log.d(TAG, "setGPSLocation: " + latLngInfo);
        log.debug(TAG + ": setGPSLocation: " + latLngInfo);
        String latLngStr[] = latLngInfo.split("&");
        LatLng latLng = new LatLng(Double.valueOf(latLngStr[1]), Double.valueOf(latLngStr[0]));
        String providerStr = LocationManager.GPS_PROVIDER;
//        String providerStr2 = LocationManager.GPS_PROVIDER;
        try {
            locationManager.setTestProviderLocation(providerStr, generateLocation(latLng));
//            locationManager.setTestProviderLocation(providerStr2, generateLocation(latLng));
            //for test
//            locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, generateLocation(latLng));
        } catch (Exception e) {
            Log.d(TAG, "setGPSLocation error");
            log.debug(TAG + ": setGPSLocation error");
V
Vergil 已提交
292 293 294 295 296
            e.printStackTrace();
        }
    }

    //remove network provider
N
NeroZhang 已提交
297
    private void rmNetworkTestProvider() {
V
Vergil 已提交
298
        try {
N
NeroZhang 已提交
299
            for (int i = 0; i < 3; i++) {
N
1.9.5  
NeroZhang 已提交
300
                String providerStr = LocationManager.NETWORK_PROVIDER;
N
NeroZhang 已提交
301 302 303
                if (locationManager.isProviderEnabled(providerStr)) {
                    Log.d(TAG, "now remove NetworkProvider: try_" + i);
                    log.debug(TAG + ": now remove NetworkProvider: try_" + i);
V
Vergil 已提交
304
//                locationManager.setTestProviderEnabled(providerStr,true);
N
1.9.5  
NeroZhang 已提交
305
                    locationManager.removeTestProvider(providerStr);
N
NeroZhang 已提交
306 307 308
                } else {
                    Log.d(TAG, "NetworkProvider is not enabled: try_" + i);
                    log.debug(TAG + ": NetworkProvider is not enabled: try_" + i);
N
1.9.5  
NeroZhang 已提交
309
                }
V
Vergil 已提交
310
            }
N
1.9.5  
NeroZhang 已提交
311

N
NeroZhang 已提交
312
        } catch (Exception e) {
V
Vergil 已提交
313 314
            e.printStackTrace();
            Log.d(TAG, "rmNetworkProvider error");
N
NeroZhang 已提交
315
            log.debug(TAG + ": rmNetworkProvider error");
V
Vergil 已提交
316 317 318 319
        }
    }

    //set new network provider
N
NeroZhang 已提交
320
    private void setNetworkTestProvider() {
V
Vergil 已提交
321
        String providerStr = LocationManager.NETWORK_PROVIDER;
N
NeroZhang 已提交
322
//        String providerStr = LocationManager.GPS_PROVIDER;
V
Vergil 已提交
323 324 325 326
        try {
            locationManager.addTestProvider(providerStr, false, false,
                    false, false, false, false,
                    false, 1, Criteria.ACCURACY_FINE);
N
NeroZhang 已提交
327 328
            Log.d(TAG, "addTestProvider[NETWORK_PROVIDER] success");
            log.debug(TAG + ": addTestProvider[NETWORK_PROVIDER] success");
V
Vergil 已提交
329 330
//            locationManager.setTestProviderStatus("network", LocationProvider.AVAILABLE, null,
//                    System.currentTimeMillis());
N
NeroZhang 已提交
331 332 333 334
        } catch (SecurityException e) {
            e.printStackTrace();
            Log.d(TAG, "addTestProvider[NETWORK_PROVIDER] error");
            log.debug(TAG + ": addTestProvider[NETWORK_PROVIDER] error");
V
Vergil 已提交
335
        }
N
NeroZhang 已提交
336 337 338 339 340 341 342 343
        if (!locationManager.isProviderEnabled(providerStr)) {
            try {
                locationManager.setTestProviderEnabled(providerStr, true);
            } catch (Exception e) {
                e.printStackTrace();
                Log.d(TAG, "setTestProviderEnabled[NETWORK_PROVIDER] error");
                log.debug(TAG + ": setTestProviderEnabled[NETWORK_PROVIDER] error");
            }
V
Vergil 已提交
344 345 346 347
        }
    }

    // for test: set GPS provider
N
NeroZhang 已提交
348
    private void rmGPSTestProvider() {
N
1.9.5  
NeroZhang 已提交
349
        try {
N
NeroZhang 已提交
350 351 352 353 354
            for (int i = 0; i < 3; i++) {
                String providerStr = LocationManager.GPS_PROVIDER;
                if (locationManager.isProviderEnabled(providerStr)) {
                    Log.d(TAG, "now remove GPSProvider: try_" + i);
                    log.debug(TAG + ": now remove GPSProvider: try_" + i);
N
1.9.5  
NeroZhang 已提交
355
//                locationManager.setTestProviderEnabled(providerStr,true);
N
NeroZhang 已提交
356 357 358 359 360
                    locationManager.removeTestProvider(providerStr);
                } else {
                    Log.d(TAG, "GPSProvider is not enabled: try_" + i);
                    log.debug(TAG + ": GPSProvider is not enabled: try_" + i);
                }
N
1.9.5  
NeroZhang 已提交
361
            }
N
NeroZhang 已提交
362 363

        } catch (Exception e) {
N
1.9.5  
NeroZhang 已提交
364 365
            e.printStackTrace();
            Log.d(TAG, "rmGPSProvider error");
N
NeroZhang 已提交
366
            log.debug(TAG + ": rmGPSProvider error");
N
1.9.5  
NeroZhang 已提交
367 368
        }
    }
N
NeroZhang 已提交
369 370

    private void setGPSTestProvider() {
V
Vergil 已提交
371
        LocationProvider provider = locationManager.getProvider(LocationManager.GPS_PROVIDER);
N
1.9.5  
NeroZhang 已提交
372 373 374 375 376 377 378 379 380 381 382 383 384
//        if (provider != null) {
//            locationManager.addTestProvider(
//                    provider.getName()
//                    , provider.requiresNetwork()
//                    , provider.requiresSatellite()
//                    , provider.requiresCell()
//                    , provider.hasMonetaryCost()
//                    , provider.supportsAltitude()
//                    , provider.supportsSpeed()
//                    , provider.supportsBearing()
//                    , provider.getPowerRequirement()
//                    , provider.getAccuracy());
//        } else {
N
NeroZhang 已提交
385
        try {
N
1.9.5  
NeroZhang 已提交
386
            locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, true, true,
V
Vergil 已提交
387
                    false, true, true, true, 0, 5);
N
NeroZhang 已提交
388 389 390 391 392 393 394 395
            Log.d(TAG, "addTestProvider[GPS_PROVIDER] success");
            log.debug(TAG + ": addTestProvider[GPS_PROVIDER] success");
        }catch (Exception e){
            e.printStackTrace();
            Log.d(TAG, "addTestProvider[GPS_PROVIDER] error");
            log.debug(TAG + ": addTestProvider[GPS_PROVIDER] error");
        }

N
1.9.5  
NeroZhang 已提交
396
//        }
N
NeroZhang 已提交
397 398 399 400 401 402 403 404 405 406
        if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            try {
                locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);
            }catch (Exception e){
                e.printStackTrace();
                Log.d(TAG, "setTestProviderEnabled[GPS_PROVIDER] error");
                log.debug(TAG + ": setTestProviderEnabled[GPS_PROVIDER] error");
            }

        }
N
1.9.5  
NeroZhang 已提交
407

V
Vergil 已提交
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436

        //新
        locationManager.setTestProviderStatus(LocationManager.GPS_PROVIDER, LocationProvider.AVAILABLE, null,
                System.currentTimeMillis());
    }


    //uuid random
    public static String getUUID() {
        return UUID.randomUUID().toString();
    }


    //get service
    public class ServiceBinder extends Binder {
        public MockGpsService getService() {
            return MockGpsService.this;
        }
    }

    public void DisplayToast(String str) {
        Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);
        toast.setGravity(Gravity.TOP, 0, 220);
        toast.show();
    }

}