Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android LocationListener调用不一致_Android_Gps_Location - Fatal编程技术网

Android LocationListener调用不一致

Android LocationListener调用不一致,android,gps,location,Android,Gps,Location,我正在尝试在android中创建我自己的位置提供者,以便在系统中注入我自己的定位数据。为此,我在系统中重用LocationManager函数,在那里注册一个我希望调用的侦听器,但并不总是调用它。我做了一些研究,但我无法找出系统用来触发事件的模式,而且谷歌也没有大量的官方文档 请注意,我没有使用系统中的任何位置提供商(GPS、网络…)。我创建自己的坐标和时间戳,并将其发布在假位置提供者中,因此几乎所有关于此问题的问题都与此问题略有不同(因此与GPS无关,无论我是否移动,最小距离参数…) 这里我向您

我正在尝试在android中创建我自己的位置提供者,以便在系统中注入我自己的定位数据。为此,我在系统中重用LocationManager函数,在那里注册一个我希望调用的侦听器,但并不总是调用它。我做了一些研究,但我无法找出系统用来触发事件的模式,而且谷歌也没有大量的官方文档

请注意,我没有使用系统中的任何位置提供商(GPS、网络…)。我创建自己的坐标和时间戳,并将其发布在假位置提供者中,因此几乎所有关于此问题的问题都与此问题略有不同(因此与GPS无关,无论我是否移动,最小距离参数…)

这里我向您展示生成的代码和日志。您可以很容易地看到,某些事件从未被触发(如onProvider启用)、在不应该触发时被触发(onProviderDisbled)或在错误的时间被触发(如onStatusChanged,只有在状态更改和位置更改后才会触发)

以下是主要代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lm = (LocationManager) getSystemService(Service.LOCATION_SERVICE);

        if (!isMockLocationSet()) {
            throw new RuntimeException("Mock Locations are disabled!");
        }

        // 1. Generate a valid random name for the mock provider
        providerName = this.generateValidProviderName();

        // 2. Create the mock provider
        System.out.println("Step 2: Create provider (" + providerName + ")");
        try {
            if (lm.getProvider(providerName) == null) {
                throw new IllegalArgumentException();
            }
        } catch (IllegalArgumentException e) {// Doesn't exist, create
            lm.addTestProvider(providerName, false, false, false, false, false,
                    false, false, Criteria.POWER_MEDIUM, Criteria.ACCURACY_HIGH);
        }

        // 3. Register for updates
        System.out.println("Step 3: Register for updates");
        MyLocationListener l = new MyLocationListener();
        lm.requestLocationUpdates(providerName, 0, 0, l);

        MyAsyncTask task = new MyAsyncTask();
        task.execute();

    }
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            Location loc = new Location(providerName);

            // 4. Enable it!
            System.out.println("Step 4: Enable it");
            lm.setTestProviderEnabled(providerName, true);

            // 5. Change the status
            System.out.println("Step 5: Change the status to AVAILABLE");
            lm.setTestProviderStatus(providerName, LocationProvider.AVAILABLE,
                    null, System.currentTimeMillis());

            // 6. Change the status
            System.out
                    .println("Step 7: Change the status to TEMPORARILY_UNAVAILABLE");
            lm.setTestProviderStatus(providerName,
                    LocationProvider.TEMPORARILY_UNAVAILABLE, null,
                    System.currentTimeMillis());

            // 7.1. Change location
            System.out.println("Step 7.1: Change Location");
            loc.setTime(System.currentTimeMillis());
            loc.setLatitude(52.0f);
            loc.setLongitude(10.0f);
            lm.setTestProviderLocation(providerName, loc);

            // 7.2. Change location
            System.out.println("Step 7.2: Change Location");
            loc.setTime(System.currentTimeMillis());
            loc.setLatitude(52.1f);
            loc.setLongitude(10.1f);
            lm.setTestProviderLocation(providerName, loc);

            // 7.3. Change the status
            System.out.println("Step 7.3: Change the status to AVAILABLE");
            lm.setTestProviderStatus(providerName, LocationProvider.AVAILABLE,
                    null, System.currentTimeMillis());

            // 7.4. Change location
            System.out.println("Step 7.4: Change Location");
            loc.setTime(System.currentTimeMillis());
            loc.setLatitude(52.2f);
            loc.setLongitude(10.2f);
            lm.setTestProviderLocation(providerName, loc);

            // 7.5. Change the status
            System.out.println("Step 7.5: Change the status to OUT_OF_SERVICE");
            lm.setTestProviderStatus(providerName,
                    LocationProvider.OUT_OF_SERVICE, null,
                    System.currentTimeMillis());

            // 7.6. Change location
            System.out.println("Step 7.6: Change Location");
            loc.setTime(System.currentTimeMillis());
            loc.setLatitude(52.3f);
            loc.setLongitude(10.3f);
            lm.setTestProviderLocation(providerName, loc);

            try {
                // 8. Delete provider
                System.out.println("8. Delete provider");
                lm.setTestProviderEnabled(providerName, false);
                lm.removeTestProvider(providerName);
            } catch (IllegalArgumentException e) {
            }
            return null;
        }
    }
当然,这不是许可问题:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

我花了很多时间研究这个问题,并将代码简化为最小的表达式,所以我希望您至少可以看一看

谢谢

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />