2017-05-20 26 views
0

Google apiを使用して最後に知られている場所を取得しようとしています。私はエラーを取得していますAndroidのアクセス許可のリクエストエラー

は、「コールは拒否できる権限が必要です...」

をしかし、私はすでに実行時の権限のために求めてきましたので、エラーがまだある理由を私は知りませんここで

は、私がやったものだ...示す:

/** Value to match on callback of request permissions response */ 
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 1; 


/** GoogleApiClient */ 
private GoogleApiClient googleApiClient = null; 


/** Last known location */ 
private Location lastLocation = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

    // ... 

    // Create a GoogleApiClient instance 
    googleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .enableAutoManage(this, this) 
      .addApi(LocationServices.API) 
      .build(); 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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! 
       if (permissions.length == 1 && 
        permissions[0] == Manifest.permission.ACCESS_FINE_LOCATION) { 

        // ERROR STILL SHOWING HERE! 
        lastLocation = LocationServices.FusedLocationApi.getLastLocation(
          googleApiClient); 
       } 


      } else { 

       // permission denied, boo! 
      } 
      break; 
     } 

     default: 
      break; 

    } 
} 


@Override 
public void onConnected(@Nullable Bundle bundle) { 

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 

     // NO ERROR HERE, IT'S FINE 
     lastLocation = LocationServices.FusedLocationApi.getLastLocation(
       googleApiClient); 
    } else { 

     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
       MY_PERMISSIONS_REQUEST_LOCATION); 

    } 
} 


@Override 
public void onConnectionSuspended(int i) { 
    // do nothing 
} 


@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    // An unresolvable error has occurred and a connection to Google APIs 
    // could not be established. Display an error message, or handle 
    // the failure silently 
    Toast toast = Toast.makeText(this, getText(R.string.google_api_connection_error), Toast.LENGTH_LONG); 
    toast.show(); 
} 

あなたが見ることができるように、これは私が何をしたいです:

lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

なぜ私はまだエラーが発生するのですか?これをどのように修正できますか?

ありがとうございます!

+0

Android Studio Javaエディター内のメッセージを参照している場合は、エラーではなく、Lint警告です。すべてが正しく実装されていると思われる場合は、クイックフィックスメニューからLintメッセージを表示しないようにするオプションが必要です。 – CommonsWare

+0

警告ではありません。エラーです。 (リンター上の赤色)。それは私にプロジェクトをビルドさせてくれません。 – Tirafesi

+0

"警告ではなく、エラーです(リンターの赤い色)" - AFAIK、Googleはもう赤しか使用しません。 「それではプロジェクトをビルドすることはできません」 - ほとんどの場合、ビルドプロセスで異なるエラーが発生しています。これを修正する必要があります。これはGradle Consoleやその他の出力ペインに表示され、Javaエディタには表示されません。この特定のメッセージは、コンパイルエラーではなく、Lint警告であるため、Javaエディタにのみ表示されます。私が提案したことを実行し、クイックフィックスメニューを使用して適切な '@ SuppressLint'アノテーションを追加することもできます。 – CommonsWare

答えて

1

リントからの苦情を解決するには、2つの方法があります。

  1. リントを幸せにするために、あなたのコードを変更し

    ありますが(通常は@SuppressLint注釈を経由して、あなただけを残してリントに知らせますこのよう

ほとんどの時間)@TargetApiなどいくつかのケースでは選択肢は、正しい答えはあなたのコードを変更することです。たとえば、文字列リソースが適切かもしれない場所で文字列を使用したとLintが告げる場合、文字列リソースを作成するのが正解である可能性が非常に高いです。

Lintが全体的にかなり優れている理由は、ほとんどの検査で個々のJava文が処理されるためです。あなたの特定のケースで

は、リントは(あなたのgetLastKnownLocation()コール)個々のJava文によってトリガーされるが、それはは、そのステートメントにつながることができますどのようなコードパスを調べる必要があり、あなたが適切に保持することが保証されているかどうかこれらの呼び出しパスすべての実行時アクセス権率直に言って、リントはあまり良くはありません。その結果、この特定のリントチェックは、私が好むよりも「誤検出」が多く発生します。

Lintが満足できるようにコードを再編成する方法があるかもしれません。しかし:

今日のリントとリントのすべての可能な将来の版の両方のため、保証するものではありません
  • 結果のコードは、

  • をlintのあまり混乱している場合でも、あなたに多くの混乱を招くことがありそれは

@SuppressLintをスタンドとして

  • あなたのコードは大丈夫かもしれ基本的に私は私がやっているか知っている」と言い、COMPLを終了私を孤独にしてください」。時には、完全に有効なコードについてLintが不平を言うのを止める唯一の方法です。

    具体的なケースでは、コードをテストします。コードが必要な実行時アクセス権を持っていても保持していなくても動作する場合、コードは正常であり、@SuppressLintは有効なアプローチです。

  • 関連する問題