0

J'essaie d'obtenir l'autorisation d'accéder à l'emplacement et en utilisant l'API du fournisseur Fusedlocation pour Android, cependant, mon application se bloque à l'ouverture. J'ai examiné la documentation du développeur Google et apporté les modifications appropriées à la méthode respective.Emplacement fusionné Erreur d'exécution de l'API erreur

Lorsque j'obtiens un emplacement, je passe les coordonnées et les stocke en utilisant SharedPreferences. Pouvez-vous s'il vous plaît laissez-moi savoir ce que je n'ai pas géré dans le programme ou manipuler incorrectement?

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, LocationListener { 

private final String TAG = "LocationActivity"; 

private GoogleApiClient mGoogleApiClient; 
private LocationRequest mLocationRequest; 

String lat, lon; 
Location mLastLocation; 
GridView androidGridView; 
String[] gridViewString = { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //checkAppPermission(); 
    Log.d(TAG, "Test location .............."); 
    //setup GoogleApiclient 
    buildGoogleApiClient(); 
    Log.d(TAG, "After build api client"); 
} 
public void checkAppPermission(){ 
    if (checkPermission()) { 
     Toast.makeText(this, "Permission already granted.", Toast.LENGTH_LONG).show(); 
    } else { 
     requestPermission(); 
     Toast.makeText(this, "Please request permission.", Toast.LENGTH_LONG).show(); 
    } 
} 
private boolean checkPermission() { 
    int result = ContextCompat.checkSelfPermission(getApplicationContext(), ACCESS_FINE_LOCATION); 
    Log.d(TAG, "Test location 2.............."); 
    return result == PackageManager.PERMISSION_GRANTED; 

} 
private void requestPermission() { 

    ActivityCompat.requestPermissions(this, new String[]{ACCESS_FINE_LOCATION}, 1); 
    Log.d(TAG, "requestPermissions.............."); 
} 
//This method will be called when the user will tap on allow or deny 
@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    //Checking the request code of our request 
    Log.d(TAG, "onRequestPermissionsResult.............."); 

    if (requestCode == 1) { 

     //If permission is granted 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      //Displaying a toast 
      Toast.makeText(this, "Permission granted now you can read the storage", Toast.LENGTH_LONG).show(); 
     } else { 
      //Displaying another toast if permission is not granted 
      Toast.makeText(this, "Oops you just denied the permission", Toast.LENGTH_LONG).show(); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (shouldShowRequestPermissionRationale(android.Manifest.permission.ACCESS_FINE_LOCATION)) { 
        showMessageOKCancel("You need to allow access to both the permissions", 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
             requestPermissions(new String[]{ACCESS_FINE_LOCATION,}, 
               1); 
            } 
           } 
          }); 
        return; 
       } 
      } 
     } 
    } 
} 


private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) { 
    new AlertDialog.Builder(MainActivity.this) 
      .setMessage(message) 
      .setPositiveButton("OK", okListener) 
      .setNegativeButton("Cancel", null) 
      .create() 
      .show(); 
} 

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
    Log.d(TAG, "GoogleAPIclient init .............."); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    // Connect the client. 
    Log.d(TAG, "onStart fired .............."); 
    mGoogleApiClient.connect(); 

} 

@Override 
protected void onStop() { 
    // Disconnecting the client invalidates it. 
    mGoogleApiClient.disconnect(); 
    Log.d(TAG, "onStop fired .............."); 
    super.onStop(); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    checkAppPermission(); 
    Log.d(TAG, "inside onconnected"); 
    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    mLocationRequest.setInterval(1000); // Update location every 10 seconds 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
      mGoogleApiClient); 
    if (mLastLocation != null) { 
     lat = String.valueOf(mLastLocation.getLatitude()); 
     lon = String.valueOf(mLastLocation.getLongitude()); 
    } 
    Log.d(TAG,"" +lat); 
    Log.d(TAG,""+ lon); 
    Log.d(TAG, "calling storeprefs inside onconnected"); 
    storeprefs(lat,lon); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Log.i(TAG, "GoogleApiClient connection has been suspend"); 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    Log.i(TAG, "GoogleApiClient connection has failed"); 
} 
@Override 
protected void onPause() { 
    super.onPause(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    // New location has now been determined 
    String lat = Double.toString(location.getLatitude()); 
    String lon = Double.toString(location.getLongitude()); 
    Log.i(TAG, lat); 
    Log.i(TAG, lon); 
    storeprefs(lat,lon); 
    // You can now create a LatLng Object for use with maps 
    //LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 

} 

Erreur:

FATAL EXCEPTION: main 
               Process: com.example.android.wesport, PID: 11572 
               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.wesport/com.example.android.wesport.MainActivity}: java.lang.IllegalStateException: GoogleApiClient is not connected yet. 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
                at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:154) 
                at android.app.ActivityThread.main(ActivityThread.java:6077) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
               Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet. 
                at com.google.android.gms.internal.zzof.zzd(Unknown Source) 
                at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source) 
                at com.example.android.wesport.MainActivity.onCreate(MainActivity.java:82) 
                at android.app.Activity.performCreate(Activity.java:6662) 
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
                at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
                at android.os.Handler.dispatchMessage(Handler.java:102)  
                at android.os.Looper.loop(Looper.java:154)  
                at android.app.ActivityThread.main(ActivityThread.java:6077)  
                at java.lang.reflect.Method.invoke(Native Method)  
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  

trace de la pile 2

FATAL EXCEPTION: main 
       Process: com.example.android.wesport, PID: 5763 
       java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations. 
        at android.os.Parcel.readException(Parcel.java:1683) 
        at android.os.Parcel.readException(Parcel.java:1636) 
        at com.google.android.gms.location.internal.zzi$zza$zza.zza(Unknown Source) 
        at com.google.android.gms.location.internal.zzk.zza(Unknown Source) 
        at com.google.android.gms.location.internal.zzl.zza(Unknown Source) 
        at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source) 
        at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source) 
        at com.google.android.gms.internal.zznt$zza.zzb(Unknown Source) 
        at com.google.android.gms.internal.zzoc.zzf(Unknown Source) 
        at com.google.android.gms.internal.zzoc.zzd(Unknown Source) 
        at com.google.android.gms.internal.zzoh.zzd(Unknown Source) 
        at com.google.android.gms.internal.zzof.zzd(Unknown Source) 
        at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source) 
        at com.example.android.wesport.MainActivity.onConnected(MainActivity.java:171) 
        at com.google.android.gms.common.internal.zzl.zzm(Unknown Source) 
        at com.google.android.gms.internal.zzof.zzk(Unknown Source) 
        at com.google.android.gms.internal.zzod.zzsb(Unknown Source) 
        at com.google.android.gms.internal.zzod.onConnected(Unknown Source) 
        at com.google.android.gms.internal.zzoh.onConnected(Unknown Source) 
        at com.google.android.gms.internal.zznw.onConnected(Unknown Source) 
        at com.google.android.gms.common.internal.zzk$1.onConnected(Unknown Source) 
        at com.google.android.gms.common.internal.zzd$zzj.zztp(Unknown Source) 
        at com.google.android.gms.common.internal.zzd$zza.zzc(Unknown Source) 
        at com.google.android.gms.common.internal.zzd$zza.zzw(Unknown Source) 
        at com.google.android.gms.common.internal.zzd$zze.zztr(Unknown Source) 
        at com.google.android.gms.common.internal.zzd$zzd.handleMessage(Unknown Source) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
+0

J'ai ajouté la trace de la pile au problème signalé maintenant –

+0

Je peux voir à partir de l'erreur que le client doit avoir l'autorisation ACCESS_FINE_LOCATION pour fournir des emplacements PRIORITY_HIGH_ACCURACY, mais dans la méthode onConnected() j'appelle check permissions(), qui vérifie l'autorisation ACCESS_FINE_LOCATION? Est-ce que je manque quelque chose? –

Répondre

1
Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet. 

Vous ne pouvez pas appeler requestLocationUpdates() jusqu'à ce que onConnected() est appelé. Toutefois, vous appelez requestLocationUpdates() déjà dans onCreate(), si vous avez déterminé que vous détenez l'autorisation d'exécution.

+0

Vous avez raison. Je l'ai corrigé, mais je reçois toujours une erreur. J'ai posté ma nouvelle trace de pile ci-dessus et les programmes mis à jour juste pour que seul le contexte d'emplacement soit maintenu –

+1

@MaheshN: Vous ne pouvez pas appeler 'requestLocationUpdates()' tant que ** both ** 'onConnected()' est appelé ** et ** you avoir la permission. En ce moment, vous appelez 'buildGoogleApiClient()' avant d'avoir la permission, et ensuite vous appelez 'requestLocationUpdates()' de 'onConnected()' (encore une fois, avant que vous ayez l'autorisation). [Cet exemple d'application] (https://github.com/commonsguy/cw-omnibus/tree/master/Location/FusedPeriodic) montre comment procéder. – CommonsWare

+0

votre lien github aidé. J'ai été en mesure d'inclure correctement les autorisations d'exécution. Merci de votre aide –