2013-08-20 3 views
0

기본적으로 Eclipse의 문제인지, 휴대 전화의 GPS인지 또는 내 앱 코드인지는 알 수 없습니다.Android GPS null 포인터 예외

문제 : 휴대 전화를 다시 시작하고 앱을 실행하면 런타임에 충돌이 발생합니다. 오류는 NullPointer입니다 (줄 번호가 제공되지 않음). 하지만 GPS를 검사하고 응용 프로그램을 다시 실행하는 onCreate()에서 두 줄을 제거하면 작동합니다. 그런 다음 해당 행을 다시 추가하면 앱이 작동합니다. 기본적으로 코드는 괜찮지 만 전화가 다시 시작된 후 처음 실행될 경우 앱이 다운됩니다.

if (new LocTools(this).checkGPS() == true) { // new method, checks if Gps is active and returns boolean. 
     LatLng ll = new LocTools(this).getMyLocation(); 
     if (ll != null) { 
      Toast.makeText(this, "LatLng: "+ll, Toast.LENGTH_SHORT).show(); 
      // ll is NOT null 
      //LocTools.goToLocation(map,ll,5,true); 
     } else { 
      Toast.makeText(this, "Gps error", Toast.LENGTH_SHORT).show(); 
     } 
    } 

은 내가 LocTools.goToLocation 라인에서 주석과 LatLng를가 null이었다 있는지 확인하기 위해 토스트를 삽입 :

좋아

편집이 내가 한 일을한다 : 여기에 몇 가지 관련 코드입니다 . 결과 : 그렇지 않았습니다. 그럼 난 LocTools.goToLocation을 주석 처리, 그래서 코드는 다음과 같이 보았다 :

 ... 
     if (ll != null) { 
      Toast.makeText(this, "LatLng: "+ll, Toast.LENGTH_SHORT).show(); 
      LocTools.goToLocation(map,ll,5,true); 
     } 
     ... 

을 그리고 응용 프로그램을 실행하고, 런타임에 추락 - NullPointer! 나는 왜 이렇게하는지 이해하지 못합니다. NullPointer가 없습니다 ...

+0

먼저 체크가 null입니다. 네가 원하는대로해라. – Tugrul

+0

그래, 문제는 LocTools.getMyLocation() 메소드 내부에 있습니다. GPS를 사용하더라도 LocationManager가 처음으로 앱을 다시 시작한 후 Null을 반환하는 이유를 확인하려고합니다. –

+0

내 대답을 확인하십시오. – Tugrul

답변

0

문제 : LatLng를 NULL이 아니 었습니다. 지도 카메라를 LatLng 위치로 이동하려고 할 때. NullPointerException이 수신되고있었습니다. 합리적인 설명이 없어서 이상하게 보였습니다.

해결 : onCreate()에서 AsyncTask를 실행했습니다. NullPointerExeception을 해결하려면 moveCamera 명령을 포함해야합니다 (내 경우 사용자 정의 LocTools.goToLocation() 메서드)가 Runnable 안에 있어야합니다. 좋아요 :

if (new LocTools(this).checkGPS() == true) { 
    Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 
     public void run() { 
      LocTools.goToLocation(map, new LocTools(getBaseContext()).getMyLocation(),5,true); 
     } 
    }); 
} 

희망이 있으면 도움이됩니다.

0

null 대신 기본 위치를 반환합니다.

public LatLng getMyLocation() { 
     final LocationManager manager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
     if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 
      builder.setTitle("GPS"); 
      builder.setIcon(R.drawable.gps); 
      builder.setMessage("Please enable GPS satellites then try again") 
       .setCancelable(false) 
       .setPositiveButton("GPS settings", new DialogInterface.OnClickListener() { 
        public void onClick(final DialogInterface dialog, final int id) { 
         mContext.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 
        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(final DialogInterface dialog, final int id) { 
         dialog.cancel(); 
        } 
       }); 
      final AlertDialog alert = builder.create(); 
      alert.show(); 


return new LatLng(mock_lat,mock_lng); 

     } else { 
      LocationManager lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
      Location l = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      double lat = l.getLatitude(); 
      double lng = l.getLongitude(); 
      return new LatLng(lat,lng); 
     } 
    } 

또는

if (new LocTools(this).getMyLocation()!=null) { 
     LatLng ll = new LocTools(this).getMyLocation(); 
     LocTools.goToLocation(map,ll,3,true); 
    } 
+0

업데이트를위한 기본 게시물보기 –