0

У меня, похоже, проблема, которую я просто не могу понять. Я создаю приложение, которое требует службы местоположения с Android. Приложению необходимо постоянно проводить опрос о местоположении. Этот код работал в течение нескольких месяцев, а затем, когда я удалил его с моего телефона и переустановил, он внезапно возвращает нуль.getLastLocation() всегда null после переустановки

Вот класс LocationProvider, который захватывает местоположение с помощью клиента API Google:

public class LocationProvider implements 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    LocationListener { 

public abstract interface LocationCallback { 
    public void handleNewLocation(Location location); 
} 

public static final String TAG = LocationProvider.class.getSimpleName(); 

/* 
* Define a request code to send to Google Play services 
* This code is returned in Activity.onActivityResult 
*/ 
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 

private LocationCallback mLocationCallback; 
private Context mContext; 
private GoogleApiClient mGoogleApiClient; 
private LocationRequest mLocationRequest; 


public LocationProvider(Context context, LocationCallback callback) { 
    mGoogleApiClient = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 

    mLocationCallback = callback; 

    // Create the LocationRequest object 
    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 

      .setInterval(3 * 1000)  // 10 seconds, in milliseconds 
      .setFastestInterval(1 * 1000); // 1 second, in milliseconds 

    mContext = context; 
} 

public void connect() { 
    mGoogleApiClient.connect(); 
} 

public void disconnect() { 
    if (mGoogleApiClient.isConnected()) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     mGoogleApiClient.disconnect(); 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 
    Log.i(TAG, "Location services connected."); 
    Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

    if (location == null) { 
     //---------------- 

     //---------------- 
     Log.i(TAG, "couldnt get location"); 
     noLocationEnabledDialog(); 
     /*LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     mLocationCallback.handleNewLocation(location); */ 
    } 
    else { 
     /* Log.i(TAG, "couldnt get location"); 
     noLocationEnabledDialog(); */ 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     mLocationCallback.handleNewLocation(location); 
    } 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    /* 
    * Google Play services can resolve some errors it detects. 
    * If the error has a resolution, try sending an Intent to 
    * start a Google Play services activity that can resolve 
    * error. 
    */ 
    if (connectionResult.hasResolution() && mContext instanceof Activity) { 
     try { 
      Activity activity = (Activity)mContext; 
      // Start an Activity that tries to resolve the error 
      connectionResult.startResolutionForResult(activity, CONNECTION_FAILURE_RESOLUTION_REQUEST); 
     /* 
     * Thrown if Google Play services canceled the original 
     * PendingIntent 
     */ 
     } catch (IntentSender.SendIntentException e) { 
      // Log the error 
      e.printStackTrace(); 
     } 
    } else { 
     /* 
     * If no resolution is available, display a dialog to the 
     * user with the error. 
     */ 
     Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode()); 
    } 
} 

public void noLocationEnabledDialog(){ 
     AlertDialog.Builder setLocationDialog = new AlertDialog.Builder(mContext); 
     setLocationDialog.setTitle(R.string.location_message_title); 
     setLocationDialog.setMessage(R.string.location_message); 

     /*Button takes user to settings*/ 
     setLocationDialog.setPositiveButton(R.string.affirmative, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       mContext.startActivity(settingsIntent); 
      } 
     }); 
     /*If no location, close the activity*/ 
     setLocationDialog.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       //do nothing....yet 
      } 
     }); 
    setLocationDialog.show(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    mLocationCallback.handleNewLocation(location); 
    Log.i(TAG, "New location received "); 
} } 

Я также попытался включения Google Maps, чтобы захватить место на устройстве, в надежде, что он будет использовать местоположение захвачен с Карт. Любопытно, что значок местоположения появился в верхней панели перед повторной установкой, и он больше не отображается. Кто-нибудь знает, почему переустановка приложения вызовет эту ошибку? Я запускаю это на Samsung Galaxy s6 под управлением Android 6.0.1

Большое спасибо!

+0

ли эта помощь: http://stackoverflow.com/a/16866830/1594776 – Yashasvi

+0

Что цель апи для проекта? –

+0

TargetSDKVersion в файле gradle равно 23. Как это может измениться, если он работает на моем телефоне буквально 5 часов назад, но теперь не работает после переустановки? – cloudyGirrl

ответ

0

Ну, похоже, я ответил на свой вопрос. Я серьезный дерп. Marshmallow требует, чтобы отдельные приложения запрашивали разрешение на размещение и т. Д. Поскольку предыдущая установка имела другой целевой API, она не нуждалась в этом, и манифест был достаточным.

Я довел целевой API до 22, и это все. В будущем мне нужно будет попросить разрешения. Этот вопрос отвечает на это довольно хорошо:

Permission issues for location in android Marshmallow applicaton

Смежные вопросы