Androidアプリ開発 FusedLocationApi Call requires Permissionを解決する

2016年07月18日(編集2016年07月18日)
このエントリーをはてなブックマークに追加

Android 6.0からは、使用するサービスの許可を、アプリのインストール時でなく、アプリ動作中に許可を求めるように変更になりました。
この記事は、FusedLocationApiの実装で発生するCall requires Permissionを修正する方法を記載した記事です。

環境はAndroid 6.0 (API level 23) です。

環境

  • OS X Yosemite
  • Oracle jdk version 1.8.0_72
  • Android Studio 2.1.2
  • android sdk 24

事象

Android Studio 2.1.2でLocationServices.FusedLocationApiを実装すると、

Call requires Permission which may be rejected....

という警告が発生してビルドに失敗します。

Call requires Permission which may be rejected....

エラーの原因

Android 6.0 (API level 23)から、Permissions at Run Timeが導入されたため。

修正方法

Permissions at Run Timeのチェック処理をコードに追加します。

Before(Error)
{project_folder}/ui/LocationFragment.java
    protected void startLocationUpdates() {
        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient,
                mLocationRequest,
                this
        ).setResultCallback(new ResultCallback<Status>() {
            @Override
            public void onResult(Status status) {
                if (status.isSuccess()) {

                } else {
                
                }
            }
        });

    }
        
After
{project_folder}/ui/LocationFragment.java
    protected void startLocationUpdates() {
        +if (ActivityCompat.checkSelfPermission(
                getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "ACCESS_FINE_LOCATION permission OK");
        } else {
            Log.d(TAG, "ACCESS_FINE_LOCATION permission NG");
            return;
        }

        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient,
                mLocationRequest,
                this
        ).setResultCallback(new ResultCallback<Status>() {
            @Override
            public void onResult(Status status) {
                if (status.isSuccess()) {

                } else {
                
                }
            }
        });

    }
        

■ 実装の解説

1. Permissions at Run Timeに対応

ActivityCompat.checkSelfPermission(
                getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
        

Permissionが必要な処理がある場合、ContextCompat.checkSelfPermission()メソッドを使います。
このメソッドは、Permissionが許可状態であればPERMISSION_GRANTEDを返し、そうでなければPERMISSION_DENIEDを返します。

このメソッドを追加することで、LocationServices.FusedLocationApiの警告が消えます。

ビルドして実行

実装を終えたら、ビルドします。
正常にビルドができるようになっています。
アプリを立ち上げます。

{project_folder}/ui/LocationFragment.java
LocationFragment: ACCESS_FINE_LOCATION permission NG        
        

permissionのチェックが行われます。

まとめ

android 6.0(marshmallow)からは、位置情報の取得でLocationServices.FusedLocationApiを使う場合、Permissions at Run Timeの実装が必要です。
targetSdkVersion 23からは必須の処理になるので、徐々に慣れていきましょう。
また、必要に応じて、チェックのDialog処理も実装しましょう。

関連記事

タグ検索で調べてみよう

Android6.0 バグ修正 位置情報