обработка ошибок в Android.Исключение вызвано: java.lang.IllegalArgumentException: provider = gps - PullRequest
1 голос
/ 15 января 2012

Я получил сообщение об ошибке для одного из моих приложений.

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

Мое приложение в основном сидит и ждет GPS и / или сетевого расположения перед отображением кнопки.Это ошибка:

java.lang.RuntimeException: Unable to resume activity 
{fr.mcnamara.irelandtravelguide/fr.mcnamara.irelandtravelguide.StartActivity}:
java.lang.IllegalArgumentException: provider=gps
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2241)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2256)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1789)
at android.app.ActivityThread.access$1500(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: provider=gps
at android.os.Parcel.readException(Parcel.java:1326)
at android.os.Parcel.readException(Parcel.java:1276)
at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:646)
at android.location.LocationManager._requestLocationUpdates(LocationManager.java:582)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:446)
at fr.mcnamara.irelandtravelguide.StartActivity.onResume(StartActivity.java:112)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
at android.app.Activity.performResume(Activity.java:3832)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2231)
... 12 more    

Код выглядит следующим образом:

public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     setContentView(R.layout.main);

     myButton = (Button) findViewById(R.id.GPS); 
     //myButton.setVisibility(INVISIBLE);

     dialog = ProgressDialog.show(this, "",  "Waiting for location...", true);
     dialog.setCancelable(true);   // 1.2
     dialog.show();         

     lm = (LocationManager) getSystemService(LOCATION_SERVICE);  
}


protected void onResume() {
    /*
     * onResume is is always called after onStart, even if the app hasn't been
     * paused
     *
     * add location listener and request updates every 1000ms or 10m
     */
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f, this);
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10f, this);
    super.onResume();
}

@Override
protected void onPause() {
    /* GPS, as it turns out, consumes battery like crazy */
    lm.removeUpdates(this);
    super.onResume();
}

@Override
public void onLocationChanged(Location location) {
    Log.v(TAG, "Location Changed");
    myButton.setVisibility( VISIBLE ); 
    noOfFixes++;

    /* display some of the data in the TextView */ 
     lon = location.getLongitude();
     lat = location.getLatitude();
     valsin.putDouble("lat", lat);
     valsin.putDouble("lon", lon); 
     Log.d(TAG, "set lat,lon:"+lat+","+lon);
     myButton.setVisibility(VISIBLE);
     dialog.dismiss(); 
     //txtInfo.setText("set lat,lon:"+lat+","+lon);
}

@Override
public void onProviderDisabled(String provider) {
    /* this is called if/when the GPS is disabled in settings */
    Log.v(TAG, "Disabled");
    /* bring up the GPS settings */
    Toast.makeText(this, "GPS Disabled..", Toast.LENGTH_SHORT).show();
    //Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    //startActivity(intent);
}

@Override
public void onProviderEnabled(String provider) {
    Log.d(TAG, "Enabled");
    Toast.makeText(this, "GPS Enabled", Toast.LENGTH_SHORT).show();
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    /* This is called when the GPS status alters */
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        Log.d(TAG, "Status Changed: Out of Service");
        //Toast.makeText(this, "Status Changed: Out of Service",
        //Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        Log.d(TAG, "Status Changed: Temporarily Unavailable");
        //Toast.makeText(this, "Status Changed: Temporarily Unavailable",
        //Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.AVAILABLE:
        Log.d(TAG, "Status Changed: Available");
        //Toast.makeText(this, "Status Changed: Available",
        //Toast.LENGTH_SHORT).show();
        break;
    }
}

@Override
protected void onStop() {
    //finish();
    super.onStop();
}

Ответы [ 2 ]

3 голосов
/ 10 сентября 2013

LocationManager.GPS_PROVIDER и другие поставщики услуг не гарантируются. Ваш код будет выдавать исключение, когда они недоступны.

Одним из решений является решение, описанное @Bourbon, - это путь, когда все, что вам нужно, это местоположение.

Однако, если вам нужно выбрать одного конкретного поставщика местоположения (например, для диагностики), используйте этот код:

if (mLocationManager.getAllProviders().indexOf(LocationManager.GPS_PROVIDER) >= 0) {
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}

Это будет регистрировать обновления местоположения, только если запрашиваемый поставщик местоположения доступен. В противном случае обновления местоположения не будут доставлены, даже если доступны другие поставщики.

2 голосов
/ 15 января 2012

Во-первых, ваша проблема в строке 112 в StartActivity.java:

в fr.mcnamara.irelandtravelguide.StartActivity.onResume (StartActivity.java:112)

Ну ...

В onCreate:

mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
mBestProvider = mLocationManager.getBestProvider(criteria, true);
mLocationManager.requestLocationUpdates(mBestProvider, 1000, 10, this);

Затем в onResume и onPause:

@Override
protected void onResume()
{
    if (mLocationListener != null)
    {
        mLocationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
        mLocationManager.requestLocationUpdates(mBestProvider, 1000, 10, this);
    }
    super.onResume();
}

@Override
protected void onPause()
{
    mLocationManager.removeUpdates(mLocationListener);
    mLocationManager = null;
    super.onPause();
}

Затем несколько советов, которые помогут вам при отладке:

Использование журналов вВаше приложение:

Log.i(YOURAPPTAG, "This is what will be viewed in the logcat");

Вы можете использовать: Log.v (), Log.d (), Log.i (), Log.w (), Log.e () для: verbose, debug, информация, предупреждение и ошибка

Вы также можете использовать свои попытки / ловли, чтобы записать исключение в logcat:

try
{
...
}
catch (Exception e)
{
    Log.e(APP_TAG, "STACKTRACE");
    Log.e(APP_TAG, Log.getStackTraceString(e));
}
...