2011-01-15 10 views
3

Ich habe einige Probleme, die ich nicht im Emulator neu erstellen kann, aber ich bekomme Fehlerberichte im Android Market, dass ich keine Ahnung habe, wie zu lösen ... jemand anderes, der es ID sehen könnte sein wery greatfuljava.lang.NullPointerException beim Abrufen der Position

manchmal wird diese reposrts

java.lang.NullPointerException 
at android.webkit.WebViewDatabase.getCacheTotalSize(WebViewDatabase.java:734) 
at android.webkit.CacheManager.trimCacheIfNeeded(CacheManager.java:548) 
at android.webkit.WebViewWorker.handleMessage(WebViewWorker.java:190) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.os.HandlerThread.run(HandlerThread.java:60) 

Und manchmal diesen Bericht

java.lang.RuntimeException: Unable to start activity ComponentInfo{polis.koll/polis.koll.WebPageLoader}: java.lang.IllegalArgumentException: provider==null 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2737) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753) 
at android.app.ActivityThread.access$2500(ActivityThread.java:129) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2107) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:143) 
at android.app.ActivityThread.main(ActivityThread.java:4701) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalArgumentException: provider==null 
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:625) 
at polis.koll.WebPageLoader.getLocation(WebPageLoader.java:54) 
at polis.koll.WebPageLoader.onCreate(WebPageLoader.java:70) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2701) 
Hier

ist mein Code

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

    private void CheckEnableGPS(){ 
     String provider = Settings.Secure.getString(getContentResolver(), 
      Settings.Secure.LOCATION_PROVIDERS_ALLOWED); 
      if(!provider.equals("")){ 
       //GPS Enabled 
       getLocation(); 
      }else{ 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(intent); 
      } 

     } 


private void getLocation() { 
    String provider = Settings.Secure.getString(getContentResolver(), 
      Settings.Secure.LOCATION_PROVIDERS_ALLOWED); 
      if(!provider.equals("")){ 
    LocationManager locationManager = 
     (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String bestprovider = locationManager.getBestProvider(criteria,true); 
    locationManager.requestLocationUpdates(bestprovider, 1, 500, this);  
    mostRecentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     }else{ 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(intent); 
      } 
    } 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    //AdManager.setTestDevices(new String[] { AdManager.TEST_EMULATOR }); 
    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); 
     } 
    }); 


    webView.setWebViewClient(new WebViewClient() { 

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


    // Testade att ta bort denna override för att få market länkar att fungera 
    // @Override 
    // public boolean shouldOverrideUrlLoading(WebView view, String url) 
    // { 
    //  view.loadUrl(url); 
    //  return true; 
    // } 
    }); 

    if (Locale.getDefault().getLanguage().equals("sv")){ 
    //webView.loadUrl("file:///android_asset/android.html"); 
     webView.loadUrl("file:///android_asset/findgps_sv.html"); 
    }else{ 
    //webView.loadUrl("http://m.bryggplatsen.se/android/polis/index.php"); 
    //webView.loadUrl("file:///android_asset/android_en.html"); 
     webView.loadUrl("file:///android_asset/findgps_en.html"); 
    } 



} 
    /** Sets up the interface for getting access to Latitude and Longitude data from device 
    **/ 




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; 
    } 

    public void sharethisapp(){ 
    startActivity(Intent.createChooser(sharespotIntent(), "Share this warning")); 
    } 
    } 


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

    getLocation(); 
    //CheckEnableGPS(); 
} 

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

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

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


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    MenuItem item = menu.add("Shut down"); 
    item.setIcon(R.drawable.exit); 

    item = menu.add("Share"); 
    item.setIcon(R.drawable.m_share); 

    item = menu.add("Fix GPS"); 
    item.setIcon(R.drawable.globe); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getTitle() == "Shut down") { 
     System.exit(0); 
     finish(); 
    } 
    if (item.getTitle() == "Fix GPS") { 
     getLocation(); 
    } 
    if (item.getTitle() == "Share") { 
     if (Locale.getDefault().getLanguage().equals("sv")){ 
     startActivity(Intent.createChooser(shareIntent(), "Dela denna app")); 
     }else{ 
     startActivity(Intent.createChooser(shareIntent(), "Share this app")); 
     } 
    } 
    return true; 
} 

private Intent shareIntent() { 
     Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); 
     shareIntent.setType("text/plain");  
    if (Locale.getDefault().getLanguage().equals("sv")){ 
     shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Testa denna android app..."); 
     return shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "index.php"); 
    }else{ 
     shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Try this cool android app..."); 
     return shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "index_en.php");   
    } 

} 


private Intent sharespotIntent() { 
    Intent sharespotIntent = new Intent(android.content.Intent.ACTION_SEND); 
    sharespotIntent.setType("text/plain");  
if (Locale.getDefault().getLanguage().equals("sv")){ 
    sharespotIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, " la just upp en ny varning i appen Polisradar"); 
    return sharespotIntent.putExtra(android.content.Intent.EXTRA_TEXT, "warn.php?lat=" + mostRecentLocation.getLatitude() + "&lng=" + mostRecentLocation.getLongitude() + ""); 
}else{ 
    sharespotIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, " just added a new warning in the app Policeradar"); 
    return sharespotIntent.putExtra(android.content.Intent.EXTRA_TEXT, "warn_en.php?lat=" + mostRecentLocation.getLatitude() + "&lng=" + mostRecentLocation.getLongitude() + "");  
    } 
} 

}

+0

Das fühlt sich an wie etwas, das nicht deine Schuld ist. Gibt es Muster hinsichtlich der Herkunft der Ausnahmen: bestimmte Geräte, bestimmte Hersteller, bestimmte Android-Versionen usw.? – CommonsWare

+0

Nein, ich kann nicht sehen, welche Telefone oder Android sie in den Berichten haben. Auf meinem eigenen Handy (HTC Desire) mit Android 2.2 habe ich manchmal bemerkt, dass die App manchmal aber nicht zu oft aufhört, nicht einfriert oder abstürzt, sondern einfach nicht zum nächsten Schritt geht. – Jerry

Antwort

1

Verfahren Settings.Secure.getString() kann null zurück, wenn der angeforderte Name nicht in der Datenbank ist. Ich weiß nicht, warum Settings.Secure.LOCATION_PROVIDERS_ALLOWED nicht gefunden wurde. Ihr Code überprüft jedoch (in getLocation()) nicht, dass der Provider nicht null ist, bevor er überprüft, dass es sich nicht um die leere Zeichenfolge handelt. Ich denke, das ist die Quelle Ihrer zweiten Ausnahme.

Scheinbar zufällige Fehler tief im Framework können auch dadurch verursacht werden, dass Sie versuchen, Ihre App auf einer OS-Version auszuführen, die etwas in Ihrem Code nicht unterstützt. Stellen Sie sicher, dass Ihr Code mit der minSdkVersion kompiliert, die Sie in Ihrem Manifest festgelegt haben, nicht nur die targetSdkVersion.

+0

ok, krank versuchen, es so zu machen, dass der Provider dosnt null zurückgibt, um damit zu beginnen, krank Bericht zurück, wie es geht – Jerry

+0

@Ted Hopp - glaubst du, dass dies den Trick tun könnte? if (provider == null) provider = ""; – Jerry

+0

Versuchen Sie "if (! (Provider == null || provider.equals (" "))) {...}". Das sollte den Trick machen. –

1

Ein Hinweis zu diesem Problem. Ich weiß nicht, ob das Ihr Problem war oder nicht, aber ich habe versucht, einige Dateien zwischen Anwendungen freizugeben und versucht, das Attribut android:sharedUserId in meiner Datei AndroidManifest.xml zu ändern. Sobald ich das getan habe, habe ich genau denselben Fehler erhalten, den Sie gemeldet haben, und meine App konnte nicht ordnungsgemäß gestartet werden (aufgrund eines Fehlers in AdRequest, so scheint es). Auch nach dem Entfernen des Attributs sharedUserId aus dem Manifest habe ich weiterhin Fehler erhalten, obwohl ich denke, dass es aus der Einstellungsdatenbank stammt.

Die Quintessenz ist, das SharedUserId-Attribut einer Anwendung nicht zu ändern, sobald es bereitgestellt wurde, oder Sie benötigen einen Deinstallations-/Neuinstallationszyklus, um alles wieder in Gang zu bringen.