Приложение принудительно закрывается при поиске местоположения по GPS - PullRequest
0 голосов
/ 14 апреля 2011

Привет, я получаю принудительное закрытие каждый раз, когда запускаю свое приложение ... оно позволяет появиться заставке, но как только я нажимаю на кнопку "Найти мое местоположение", оно закрывается ... то, что я нахожу странно, что это нормально работает с Wi-Fi, когда мой GPS отключен .. Я проверил, чтобы убедиться, что у меня есть права доступа в манифесте также. Я прикрепил logcat. Могу ли я предположить, что это правильно в классе MyLocOverlay в строке 23? Может кто-нибудь указать мне правильное направление для исправления этого? Спасибо

public class MyLocOverlay extends Overlay {
    private final int Radius = 5;

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        Projection projection = mapView.getProjection();
        if (shadow == false) {
            // line below is line 23
            Double lat = location.getLatitude()*1E6;
            Double lng = location.getLongitude()*1E6;
            GeoPoint geoPoint; geoPoint = new GeoPoint(lat.intValue(),lng.intValue());
        }
    }
}

Logcat

04-14 02:41:30.332: INFO/ActivityManager(102): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.irwine.touristapplication/.SplashScreen }

04-14 02:41:30.502: INFO/ActivityManager(102): Start proc com.irwine.touristapplication for activity com.irwine.touristapplication/.SplashScreen: pid=13759 uid=10060 gids={3003}

04-14 02:41:31.012: WARN/Rosie(5927): mAddHtcWidgetByOtherActivity = false, mIsOpenSlideWhenLeaveLaunch = true

04-14 02:41:31.012: WARN/InputManagerService(102): Ignoring hideSoftInput of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44b033b8

04-14 02:41:31.132: WARN/InputManagerService(102): Got RemoteException sending setActive(false) notification to pid 13731 uid 10060

04-14 02:41:31.322: INFO/ActivityManager(102): Displayed activity com.irwine.touristapplication/.SplashScreen: 834 ms (total 33041 ms)

04-14 02:41:36.152: INFO/ActivityManager(102): Starting activity: Intent { cmp=com.irwine.touristapplication/.mainmenu }

04-14 02:41:36.542: INFO/ActivityManager(102): Displayed activity com.irwine.touristapplication/.mainmenu: 337 ms (total 337 ms)

04-14 02:41:40.152: INFO/ActivityManager(102): Starting activity: Intent { cmp=com.irwine.touristapplication/.gps }

04-14 02:41:42.502: INFO/MapActivity(13759): Handling network change notification:CONNECTED

04-14 02:41:42.502: ERROR/MapActivity(13759): Couldn't get connection factory client

04-14 02:41:42.752: WARN/dalvikvm(13759): threadid=1: thread exiting with uncaught exception (group=0x40028a00)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759): FATAL EXCEPTION: main

04-14 02:41:42.782: ERROR/AndroidRuntime(13759): java.lang.NullPointerException

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at com.irwine.touristapplication.MyLocOverlay.draw(MyLocOverlay.java:23)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at com.google.android.maps.Overlay.draw(Overlay.java:179)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:45)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at com.google.android.maps.MapView.onDraw(MapView.java:494)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.View.draw(View.java:6739)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.View.draw(View.java:6742)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.widget.FrameLayout.draw(FrameLayout.java:352)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.View.draw(View.java:6742)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.widget.FrameLayout.draw(FrameLayout.java:352)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1872)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewRoot.draw(ViewRoot.java:1422)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1167)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1744)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.os.Handler.dispatchMessage(Handler.java:99)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.os.Looper.loop(Looper.java:143)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at android.app.ActivityThread.main(ActivityThread.java:4914)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at java.lang.reflect.Method.invokeNative(Native Method)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at java.lang.reflect.Method.invoke(Method.java:521)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

04-14 02:41:42.782: ERROR/AndroidRuntime(13759):     at dalvik.system.NativeStart.main(Native Method)

04-14 02:41:42.802: WARN/ActivityManager(102):   Force finishing activity com.irwine.touristapplication/.gps

04-14 02:41:42.812: WARN/ActivityManager(102):   Force finishing activity com.irwine.touristapplication/.mainmenu
04-14 
02:41:43.316: WARN/ActivityManager(102): Activity pause timeout for HistoryRecord{44eb0130 com.irwine.touristapplication/.gps}

04-14 02:41:44.742: INFO/Process(13759): Sending signal. PID: 13759 SIG: 9

04-14 02:41:44.752: INFO/WindowManager(102): WIN DEATH: Window{44b42110 com.irwine.touristapplication/com.irwine.touristapplication.mainmenu paused=true}

04-14 02:41:44.762: INFO/ActivityManager(102): Process com.irwine.touristapplication (pid 13759) has died.

04-14 02:41:44.772: INFO/WindowManager(102): WIN DEATH: Window{44b66298 com.irwine.touristapplication/com.irwine.touristapplication.gps paused=false}

04-14 02:41:53.654: WARN/ActivityManager(102): Activity destroy timeout for HistoryRecord{44bd91e8 com.irwine.touristapplication/.mainmenu}

04-14 02:41:53.699: WARN/ActivityManager(102): Activity destroy timeout for HistoryRecord{44eb0130 com.irwine.touristapplication/.gps}

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Вы говорите, что у вас есть необходимые разрешения. Просто чтобы быть уверенным, вы знаете, что есть два разных разрешения для местоположения?

String ACCESS_COARSE_LOCATION Позволяет приложению получать доступ к грубому расположению (например, Cell-ID, WiFi) Строка ACCESS_FINE_LOCATION Позволяет приложению получать доступ к точному (например, GPS) местоположению

Manifest.permission

0 голосов
/ 14 апреля 2011

Это важно

EXCEPTION: main 04-14 02:41:42.782: ERROR/AndroidRuntime(13759): java.lang.NullPointerException 

ERROR/AndroidRuntime(13759):     at com.irwine.touristapplication.MyLocOverlay.draw(MyLocOverlay.java:23)

Если бы мне пришлось угадывать, я бы сказал, что ваше местоположение нулевое.Попробуйте запустить в режиме отладки и посмотрите, что вы можете найти.Я предлагаю поставить точку останова ДО строки ошибки и посмотреть, что это за переменные ... если ваша переменная местоположения равна нулю, это ваша проблема, способ исправить это - продолжать пинговать до тех пор, пока вы ее не получите ..

Решение состоит в том, чтобы проверить, является ли местоположение нулевым. Если оно является нулевым, то это означает, что вам нужно запросить местоположение снова.Если вы пытаетесь пинговать в течение 20 секунд и ничего не получаете, продолжайте пинговать, пока не получите что-то.В идеале вы хотите, чтобы время истекло после 5 попыток ... Это потому, что если вы пингуетесь постоянно, пользователь будет ненавидеть вас .Тем не мение;Если пройдут 100 секунд, и вы не получите местоположение, то время ожидания и попросите пользователя снова запросить это местоположение или попросить его повторить попытку позже.

ОБНОВЛЕНИЕ

В частности, я вижу ошибку с этим.Вот как я бы подошел к этому:

Запрос местоположения -> Ожидание местоположения через слушателя местоположения -> После получения местоположений обновите оверлей.

Продолжайте запрашивать, пока возвращаемое местоположение является нулевым.Тайм-аут, как я сказал.

Вот пример:

мой класс LocationListener:

public class myLocationListener implements LocationListener {
        Location L;

        public void onLocationChanged(Location arg0) {
            Toast.makeText(getApplicationContext(), "Location has changed",
                    Toast.LENGTH_SHORT).show();
            L = arg0;
            updateNewLocation(L);
        }}

Функция, которую я вызываю:

public void updateNewLocation(Location loc) {

        // while the location is not null get latitude and longitude
        // information
        // :: Null means that the GPS provider is off or there is an issue
        if (loc != null) {}}

ФункцияТело, которое я использую для запроса местоположения вместе с таймаутом:

Toast.makeText(getApplicationContext(),
                            "Searching for your location.", Toast.LENGTH_SHORT)
                            .show();
                    locationManager.requestLocationUpdates(provider, 20000, 5,
                            locationListener);

                    // Thread to count until timeout (15 * 5000ms)
                    Thread t = new Thread(new Runnable() {
                        public void run() {
                            count = 0;

                            for (int i = 0; i < 15; i++) {
                                if (locationListener.L == null) {
                                    try {
                                        handler.sendMessage(handler
                                                .obtainMessage());
                                        Thread.sleep(5000);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }

                            }

Обработчик, чтобы помочь с таймаутом

Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            count++;
            if (count == 15) {
                error();
                count = 0;
            }
        }

    };
...