Android requestLocationUpdates在某些终端中不会调用onLocationChanged

时间:2013-05-21 10:42:54

标签: java android location locationmanager locationlistener

我正在开发一个使用网络位置的应用程序,但我收到了一些用户反馈说他们从未传递过这段代码,我假设问题是从未调用过的位置,但它只发生在一些偏离中,我不能强迫我的失败。

有没有机会解决或控制它?显示吐司说无法找到位置,将为我工作...

我知道如果用户重新启动手机,该位置会有效,但这不是用户的解决方案

我把代码留在了这里......

final LocationManager lm = (LocationManager) thisOfActivity
                        .getSystemService(Context.LOCATION_SERVICE);
                boolean network_enabled = lm
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                // SOME STUFF

                Location net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);


                final LocationListener locationListenerNetwork = new LocationListener() {

                    public void onLocationChanged(Location location) {
                        double lat = location.getLatitude();
                        double lon = location.getLongitude();
                        Log.e("LATLON", lat + "," + lon);
                        lm.removeUpdates(this);

                        // SOME STUFF
                        myTask task = new myTask();

                        if (progress.isShowing())
                            progress.dismiss();
                        task.execute();
                        thisOfActivity.registerForContextMenu(tweetList);
                    }

                    public void onProviderDisabled(String provider) {
                        thisOfActivity
                                .startActivityForResult(
                                        new Intent(
                                                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS),
                                        0);
                        if (progress.isShowing())
                            progress.dismiss();
                        MainActivity.accionEnCuro = false;
                        Toast.makeText(
                                thisOfActivity.getApplicationContext(),
                                thisOfActivity.getString(R.string.location),
                                Toast.LENGTH_SHORT).show();
                    }

                    public void onProviderEnabled(String provider) {
                    }

                    @Override
                    public void onStatusChanged(String provider,
                            int status, Bundle extras) {
                        switch( status ) {
                        case LocationProvider.AVAILABLE:
                                Log.e("LocProv", "AVAILABLE");
                            break;
                        case LocationProvider.OUT_OF_SERVICE:
                                Log.e("LocProv", "OUT_OF_SERVICE");
                            break;
                        case LocationProvider.TEMPORARILY_UNAVAILABLE:
                                Log.e("LocProv", "TEMPORARILY_UNAVAILABLE");
                            break;
                        }

                    }
                };

                if (network_enabled) {
                    lm.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER, 0, 0,
                            locationListenerNetwork);
                } else {
                    thisOfActivity
                            .startActivityForResult(
                                    new Intent(
                                            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS),
                                    0);
                    if (progress.isShowing())
                        progress.dismiss();
                    MainActivity.accionEnCuro = false;
                    Toast.makeText(thisOfActivity.getApplicationContext(),
                            thisOfActivity.getString(R.string.location),
                            Toast.LENGTH_LONG).show();
                }

我已经尝试了下一个想法,我认为它可以工作,至少是为了获得一个位置而不是让用户等待。

                final LocationManager lm = (LocationManager) thisOfActivity
                        .getSystemService(Context.LOCATION_SERVICE);
                boolean network_enabled = lm
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                // SOME STUFF

                LocationListener locationListenerNetwork = null;

                // Constructor
                class MyThread implements Runnable {
                    LocationListener locationListenerNetwork;
                       public MyThread(LocationListener lln) {
                         locationListenerNetwork = lln;
                       }

                       public void run() {
                       }
                    }

                final Handler myHandler = new Handler();
                //Here's a runnable/handler combo
                final Runnable MyRunnable = new MyThread(locationListenerNetwork)
                {
                    @Override
                    public void run() {
                        if (locationListenerNetwork != null)
                            lm.removeUpdates(locationListenerNetwork);

                        Location location = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if(location != null)
                        {
                            double lat = location.getLatitude();
                            double lon = location.getLongitude();

                            Log.e("LATLON", lat + "," + lon);

                            ListView tweetList = (ListView) thisOfActivity
                                    .findViewById(R.id.tweets);
                            jsonUpdateAsyncTask task = new jsonUpdateAsyncTask(
                                    thisOfActivity, Double.toString(lat),
                                    Double.toString(lon), tweetList);

                            if (progress.isShowing())
                                progress.dismiss();
                            task.execute();
                            thisOfActivity.registerForContextMenu(tweetList);
                        }
                        else
                        {
                            if (progress.isShowing())
                                progress.dismiss();
                            MainActivity.accionEnCuro = false;
                            Toast.makeText(thisOfActivity.getApplicationContext(),
                                    thisOfActivity.getString(R.string.location),
                                    Toast.LENGTH_LONG).show();
                        }

                    }               
                };

                locationListenerNetwork = new LocationListener() {

                    public void onLocationChanged(Location location) {
                        double lat = location.getLatitude();
                        double lon = location.getLongitude();
                        Log.e("LATLON", lat + "," + lon);
                        lm.removeUpdates(this);

                        myHandler.removeCallbacks(MyRunnable);

                        ListView tweetList = (ListView) thisOfActivity
                                .findViewById(R.id.tweets);
                        jsonUpdateAsyncTask task = new jsonUpdateAsyncTask(
                                thisOfActivity, Double.toString(lat),
                                Double.toString(lon), tweetList);

                        if (progress.isShowing())
                            progress.dismiss();
                        task.execute();
                        thisOfActivity.registerForContextMenu(tweetList);
                    }

                    public void onProviderDisabled(String provider) {
                        thisOfActivity
                                .startActivityForResult(
                                        new Intent(
                                                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS),
                                        0);
                        if (progress.isShowing())
                            progress.dismiss();
                        MainActivity.accionEnCuro = false;
                        Toast.makeText(
                                thisOfActivity.getApplicationContext(),
                                thisOfActivity.getString(R.string.location),
                                Toast.LENGTH_SHORT).show();
                    }

                    public void onProviderEnabled(String provider) {
                    }

                    @Override
                    public void onStatusChanged(String provider,
                            int status, Bundle extras) {
                        switch( status ) {
                        case LocationProvider.AVAILABLE:
                                Log.e("LocProv", "AVAILABLE");
                            break;
                        case LocationProvider.OUT_OF_SERVICE:
                                Log.e("LocProv", "OUT_OF_SERVICE");
                            break;
                        case LocationProvider.TEMPORARILY_UNAVAILABLE:
                                Log.e("LocProv", "TEMPORARILY_UNAVAILABLE");
                            break;
                        }

                    }
                };

                if (network_enabled) {
                    myHandler.postDelayed(MyRunnable, 10 * 1000);

                    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0,locationListenerNetwork);
                } else {

                // MORE STUFF

意见?

0 个答案:

没有答案