2010-11-28 8 views
1

im довольно новый для разработки в android и им не shure, как решить эту проблему. Я выпустил приложение и начал получать сообщения от некоторых ppl с Android 2.1, которые он сбой. Работал хорошо в моем HTC Desire 2.2 и, кажется, работает в симуляторе, и он сработает в симуляторе 2.1, если я не быстро отправлю некоторые GPS с eclipse DDMS.getLastKnownLocation crashes android 2.1

И это не крах, если я изменить код, чтобы не попросить позиции GPS ...

Я ищу Google ALOT на него и, кажется, ошибка в том, что «getLastKnownLocatio» иногда retrns утратившим что делает его аварии, но я не могу найти обходной путь для этого, чтобы поместиться в моем коде .... им не лучший программист в мире :)

Пожалуйста, помогите мне ...

Вот мой Java:

public class WebPageLoader extends Activity implements LocationListener{ 
public static String Android_ID = null; 
final Activity activity = this; 
private Location mostRecentLocation; 



private void getLocation() { 

    LocationManager locationManager = 
     (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String provider = locationManager.getBestProvider(criteria,true); 
    //In order to make sure the device is getting the location, request updates. 
    //locationManager.requestLocationUpdates(provider, 10, 1, this); 

    //mostRecentLocation = locationManager.getLastKnownLocation(provider); 
    locationManager.requestLocationUpdates(provider, 1000, 500, this);  
    mostRecentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

    } 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS); 
    setContentView(R.layout.main); 
    //getLocation(); 
    Android_ID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
    WebView webView = (WebView) findViewById(R.id.webView); 
    webView.getSettings().setJavaScriptEnabled(true); 
    /** Allows JavaScript calls to access application resources **/ 
    webView.addJavascriptInterface(new JavaScriptInterface(), "android16"); 
    webView.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) 
     { 
      activity.setTitle("Letar poliskontroller"); 
      activity.setProgress(progress * 100); 

      if(progress == 100) 
       activity.setTitle(R.string.app_name); 
     } 
    }); 
    getLocation(); 




    webView.setWebViewClient(new WebViewClient() { 

     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
     { 
      // Handle the error 
     } 



     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
      view.loadUrl(url); 
      return true; 
     } 
    }); 

    webView.loadUrl("http://m.domain.se/android/file.php"); 
} 
    /** Sets up the interface for getting access to Latitude and Longitude data from device 
    **/ 




private class JavaScriptInterface { 

    public double getLatitude(){ 
     return mostRecentLocation.getLatitude(); 
    } 
    public double getLongitude(){ 
     return mostRecentLocation.getLongitude(); 
    } 

    public String getAndroid_ID(){ 
     return Android_ID; 
    } 
    } 


@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 

    getLocation(); 
    //android16(); 

} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 

    MenuItem item = menu.add("Meny"); 
    item = menu.add("Stäng app"); 
    item.setIcon(R.drawable.exit); 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if (item.getTitle() == "Stäng app") { 
     finish(); 
    } 
    return true; 
} 

}

UPDATE

С вашим предложением приемлема для javacall Wich предотвращает сбои, я также добавил это в Java карты reciving Google

 latitude = window.android16.getLatitude(); 
    longitude = window.android16.getLongitude(); 

    if (isNaN(latitude)) { 
     latitude = 61.72680992165949; 
    } else { 
     latitude = latitude; 
    } 

     if (isNaN(longitude)) { 
     longitude = 17.10124969482422; 
    } else { 
     longitude = longitude; 
    } 

Теперь, кажется, работает. .. Приветствия и благодарности, много, попробуй это, и возвращайся, чтобы сообщить, когда я его немного исправлю.

ответ

1

LocationManager.getLastKnownLocation() возвращает последнее известное местоположение для провайдера, или null. Поэтому в вашем JavaScriptInterface вы также должны проверить нуль, чтобы не получить исключение NullPointerException.

UPDATE:

private class JavaScriptInterface { 

    public double getLatitude(){ 
     return mostRecentLocation != null ? mostRecentLocation.getLatitude() : Double.NaN; 
    } 

    public double getLongitude(){ 
     return mostRecentLocation != null ? mostRecentLocation.getLongitude() : Double.NaN; 
    } 

    public String getAndroid_ID(){ 
     return Android_ID; 
    } 
} 

Кроме того, ваш Javascript должен быть установлен, чтобы иметь возможность обрабатывать Double.NaN как указание местонахождения неготовности. Вы также можете использовать некоторую другую константу вместо Double.NaN для представления этого состояния, она должна быть просто вне диапазона действительных значений lon/lat.

+0

Спасибо за реплику, althou im not shure, как я должен это делать. не могли бы вы дать мне небольшой пример? – Jerry 2010-11-28 23:16:46

+1

@Jerry - см. Раздел ОБНОВЛЕНИЕ. – 2010-11-28 23:40:00

0

Попробуйте что-то вроде этого, хотя по умолчанию возвращает 0 (если mostRecentLocation равно null), возможно, не то, что вы хотите - не знаете, что еще нужно делать, как вам нужно что-то вернуть.

private class JavaScriptInterface { 

     public double getLatitude(){ 
     if (mostRecentLocation != null) // Check for null 
       return mostRecentLocation.getLatitude(); 
     else 
       return (Double) 0; 
     } 
     public double getLongitude(){ 
     if (mostRecentLocation != null) //Check for null 
       return mostRecentLocation.getLongitude(); 
     else 
       return (Double) 0; 
     } 

     public String getAndroid_ID(){ 
      return Android_ID; 
     } 
} 
Смежные вопросы