0

我试图获取访问位置的权限并使用Fusedlocation提供者android的API,但是,我的应用在打开时崩溃。我查看了Google开发者文档,并根据相应的方法进行了适当的更改。融合位置API运行时权限错误

当我得到一个位置时,我传递坐标并使用SharedPreferences存储它们。你能否让我知道我在程序中没有处理什么或处理不正确?

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()); 

} 

错误:

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)  

堆栈跟踪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

我已经将堆栈跟踪添加到报告的问题 –

+0

我可以从错误中看到客户端必须具有ACCESS_FINE_LOCATION权限才能请求PRIORITY_HIGH_ACCURACY位置,但是我调用的是检查权限()的onConnected()方法,验证ACCESS_FINE_LOCATION权限?我错过了什么吗? –

回答

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

你不能叫requestLocationUpdates()直到onConnected()被调用。但是,如果您确定拥有运行时许可权,则您正在调用requestLocationUpdates()已在onCreate()中。

+0

你是对的,我修好了,但是我仍然得到一个错误。我已经发布了上面的新堆栈跟踪和更新程序,只保留位置上下文 –

+1

@MaheshN:直到** ** onConnected()调用**和**之后,才能调用requestLocationUpdates()有权限。现在,您在获得权限之前调用'buildGoogleApiClient()',然后从'onConnected()'调用'requestLocationUpdates()'(再次获得许可之前)。 [这个示例应用程序](https://github.com/commonsguy/cw-omnibus/tree/master/Location/FusedPeriodic)演示了如何做到这一点。 – CommonsWare

+0

你的github链接帮助。我能够正确包含运行时权限。谢谢你的帮助 –