2016-08-29 20 views
0

私は、アクティビティの「マップ」を開いたときにピンをドロップすることで、ユーザーに場所を表示するアプリを持っています。私はまた、ユーザーの場所を表示したいと思います。また、追加情報から提供された情報からマーカーに何か問題が生じた場合、地図はユーザーの場所に集中します。Androidランタイムロケーションサービスのアクセス許可

他にも、私のアプリがAndroid 6.0以上のユーザーの場所を表示していないことに気付きました。そこで私はSOとGoogleを立ち上げて検索し、いくつかのスレッドとチュートリアルを見つけました。だから、アクセス許可がすでに利用可能かどうか、またはメソッドのcheckSelfPermissionsを呼び出して許可する必要があるかどうかを確認しなければならないことが判明し、付与されていない場合はrequestPermissionsを呼び出して要求する必要があります。彼らがリクエストされたとき、私はマーカーを設定し、ユーザーの場所を表示したい(または、何かが余分なマーカー情報で台無しになっている場合はマップの中心にする)。私は私のメソッドsetUpMarkerでこれをしたい。以下は私のonMapReady(マップの準備ができたときに呼び出さ)とonRequestPermissionsResult(許可要求からユーザの応答があった場合に呼び出される)方法である:

public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     // Permission is not yet available and needs to be asked for 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) { 
      // We provide an additional rationale to the user if the permission was not granted 
      // and the user would benefit from additional context for the use of the permission. 
      // For example if the user has previously denied the permission. 
      new AlertDialog.Builder(Map.this) 
        .setMessage("To show the location the permission is needed") 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          ActivityCompat.requestPermissions(Map.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION_REQUEST_ID); 
         } 
        }) 
        .setNegativeButton("Cancel", null) 
        .create() 
        .show(); 
     } else { 
      // Permission has not been granted yet. Request it directly. 
      ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION_REQUEST_ID); 
     } 

    } else { 
     // Permission is already available 
     setUpMarker(); 
    } 

} 


@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case LOCATION_PERMISSION_REQUEST_ID: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // The permission request was granted, we set up the marker 
       setUpMarker(); 
      } else { 
       // The permission request was denied, we make the user aware of why the location is not shown 
       Toast.makeText(this,"Since the permission wasn't granted we can't show the location",Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 

    } 
} 

今は、私はまだ私のsetUpMarkerでエラーが出ますメソッドを使用して、ユーザーの場所を有効にしたいときや、ユーザーの場所にマップを中央に配置したいときに使用します。私が得るエラーは次のとおりです:

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with 'checkPermission') or explicitly handle a potential 'SecurityException'. 

しかし、私は既にアクセス許可をチェックしました!ここに私のsetUpMarkerは次のとおりです。

private void setUpMarker() { 
    //HERE I GET THE ERROR 
    mMap.setMyLocationEnabled(true); 

    if(!getIntent().getExtras().isEmpty()) { 
     // Latitude and longitude was retrieved successfully, set up marker 

     ... 

    } else { 
     // Latitude and longitude was not retrieved, zoom to current location 

     LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 

     // AND HERE I GET THE ERROR TOO 
     Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false)); 
     if (location != null) { 
      mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
        new LatLng(location.getLatitude(), location.getLongitude()), 13)); 

      CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(new LatLng(location.getLatitude(), location.getLongitude())) 
        .zoom(17) 
        .bearing(90) 
        .tilt(40) 
        .build(); 
      mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

     } 

    } 
} 

は、どのように私は、アプリケーションがアクセス権を覚えてもらう、または別の方法でこれを回避できますか?私は同様のスレッドをチェックアウトしましたが、この種の問題はないようです。

答えて

1

これはLintのエラーです - 同じ呼び出しをメソッドに追加すると(たとえそれが常に返されることはわかっていますが)、Lintを喜ばせるか、Lintエラーを抑制することができます。

+0

大丈夫です!もう一つの注意:ContextCompatとActivityCompatの違いは何ですか? – jahed

+0

ActivityがContextを拡張するのと同様に、ActivityCompatはContextCompatを拡張し、Activity固有のメソッドを追加します。 'checkSelfPermission'はちょうどContextを必要とし、Activityは必要としません – ianhanniballake

関連する問題