2016-03-23 8 views
0

実行時に自分のアクティビティの場所のパーミッションをチェックしましたが、まだパーミッションチェックを追加するようにエラーが表示されます... ここは自分のコードです。 onCreate()で私が追加しました:実行時にロケーション権限のチェックを追加しましたが、まだエラーが発生します

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      bPermissionGranted = checkLocationPermission(); 
     } 

でのonConnected上:

public void onConnected(Bundle bundle) { 

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (bPermissionGranted) { 
      Location location =  LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

      handleNewLocation(location); 

     } else { 

      Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

      handleNewLocation(location); 
     } 
    } 
} 

と2つの方法を:

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 

public boolean checkLocationPermission() { 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

      //Prompt the user once explanation has been shown 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 


     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
     return false; 
    } else { 
     return true; 
    } 
} 

public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

       Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

       handleNewLocation(location); 


      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

そして、それはまだ赤いエラーでのフォローをマーク:

Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

答えて

0

あなたのコードは多少うまくあります。 onCreateの許可を確認しないでください。 onConnected()メソッドで確認してください。これは、ユーザーがまだ許可を与えていない可能性があり、前もってonConnected()が実行されている可能性があるからです。

次に、許可結果がonRequestPermissionsResult()に届いたら、結果が肯定的であればロケーション更新を取得し始めます。

またアドバイス -

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 

コードのこの部分は冗長です。 Androidは、Android M以上の実行時のアクセス許可を必要とするだけなので、アクセス許可チェックコードは、AndroidバージョンがMを超えていれば実行されません。それ以外の場合は実行されません。

のonCreateで
+0

:bPermissionGranted = checkLocationPermissionに() - 実際にIMユーザー応答でbPermissionGrantedを初期化...ユーザー(onRequestPermissionsResult)との対話に私を取る.. – Hilit

+0

ので、この答えは私の問題 – Hilit

+1

が解決しない、私はあなたをバディ知っていますユーザの応答でbPermissionGrantedを初期化しますが、ユーザが応答を提供する前に 'onConnected()'を呼び出すことができます。そのとき、bPermissionGrantedはその時点で初期化されないため、問題が発生します。だからこそ、あなたのコードを 'onConnected()'で始めるのです。 –

関連する問題