java.lang.NullPointerException при получении местоположения - PullRequest
3 голосов
/ 16 января 2011

У меня есть некоторые проблемы, я не могу воссоздать в эмуляторе, но я продолжаю получать сообщения об ошибках в Android Market, которые я понятия не имею, как решить ... кто-то еще, кто мог бы видеть это, был бы очень рад

Иногда этот отчет

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)

И иногда этот отчет

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)

Вот мой код

    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() + "");       
    }
}

}

Ответы [ 2 ]

1 голос
/ 09 октября 2011

Одна заметка по этому вопросу. Не знаю, была ли это ваша проблема или нет, но я пытался поделиться некоторыми файлами между приложениями и попытался изменить атрибут android: sharedUserId в моем файле AndroidManifest.xml. Как только я это сделал, я получил точно такую ​​же ошибку, о которой вы сообщили, и мое приложение не запустилось должным образом (кажется, из-за сбоя в AdRequest). Даже после удаления атрибута sharedUserId из манифеста я продолжал получать ошибки, хотя я думаю, что это было из базы данных настроек.

Суть в том, чтобы не изменять атрибут sharedUserId приложения после его развертывания, иначе потребуется цикл удаления / переустановки, чтобы все снова заработало.

1 голос
/ 16 января 2011

Метод Settings.Secure.getString () может вернуть ноль, если запрошенное имя отсутствует в базе данных.Я не знаю, почему Settings.Secure.LOCATION_PROVIDERS_ALLOWED не будет найден.Однако ваш код не проверяет (в getLocation ()), что провайдер не является нулевым, прежде чем проверять, что это не пустая строка.Я думаю, что это источник вашего второго исключения.

Казалось бы, случайные ошибки в глубине фреймворка могут быть вызваны попыткой запустить ваше приложение в версии ОС, которая не поддерживает что-то в вашем коде.Убедитесь, что ваш код компилируется с minSdkVersion, который вы установили в манифесте, а не только с targetSdkVersion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...