2016-05-27 5 views
2

実行時にAndroid Marshmallow実行時アクセス権を特定のアプリケーションで処理する必要があるかどうかを確認したいと考えています。Android:実行時のアクセス許可を尋ねる必要があるかどうかを確認してください

以下の前提が正しいですか?ここで

/** 
* Checks whether runtime permissions must be handled or not. 
* 
* @param context Application context. 
* @return Handle runtime permissions or not. 
*/ 
public static boolean shouldCheckRuntimePermissions(Context context) { 
    return 
      isApplicationWithMarshmallowTargetSdkVersion(context) && 
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; 
} 

/** 
* Checks whether the app is compiled with targetSdkVersion Marshmallow or above. 
* 
* @param context Application context. 
* @return Application targetSdkVersion above 23 or not. 
*/ 
public static boolean isApplicationWithMarshmallowTargetSdkVersion(Context context) { 
    return 
      context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M; 
} 

は、例えば ACCESS_COARSE_LOCATION権限がAndroidのマシュマロランタイム権限を持つユーザーに依頼することが必要であったところ、私が詳しく説明しているテーブルです。

==================== 
target SDK |<23| 23| 
==================== 
     |<23| X | X | 
     ------------| 
OS SDK |23 | X | V | 
==================== 

私はサポートライブラリhelpersの存在を知っているが、私は、この特定のケースのためにそれらを避けたいと思います。

+1

は、私はあなただけのターゲットバージョンとビルドSDKのバージョンを確認する必要があると思うだけでは、開発しながら、狙ったSDKを示します。 –

+0

@ LuisMiguelSierra私はtargetSDK 23とOS SDK 22を使ってアプリケーションを実行すると、実行時の権限を要求する必要はありません。少なくともこれは私が危険なCOARSE_LOCATIONでテストしたものです。 – GoRoS

+0

あなたの前提は良いと思います。いいですか? –

答えて

3

@ LuisMiguelSierraが正しく、質問の最後に投稿したリンクに回答があり、わかりませんでした。ここに私の質問に答えると、私の仮定および方法は正しかった確認引用されています、あなたのアプリが通り、 通常、それはそのアプリのマニフェストに必要と危険な権限の両方を宣言するには、Androidのすべてのバージョンで

必要がありますDeclaring Permissionsに記載されている デバイスは、Android 5.1以下を実行しているか、アプリのターゲットSDKが22以下の場合

  • :しかし、その 宣言の効果は、システムのバージョンとあなたの アプリのターゲットSDKレベルに応じて異なる場合
    マニフェストに危険なアクセス許可を記載している場合、ユーザーは
    アプリをインストールする際に許可を与えなければなりません。彼らが許可を与えない場合、システムはアプリケーションを全くインストールしません。
  • デバイスがAndroid 6.0以降を実行していて、アプリのターゲットSDKが23以上の場合:アプリは のマニフェストにアクセス許可をリストしておき、アプリが動作している間に。ユーザーは各 権限を付与または拒否することができ、ユーザーが許可要求を拒否した場合でも、制限付き
    の機能で引き続き実行することができます。

ので、許可を依頼するときのこの仮定が確認されています

==================== 
target SDK |<23| 23| 
==================== 
     |<23| X | X | 
     ------------| 
OS SDK |23 | X | V | 
==================== 
1

Iあなたの活動のチェック(APIのバージョン> = 23と許可が拒否された)場合、許可

if (android.os.Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) { 
     requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION); 
} 

を要求し、ユーザからの結果を得ることがちょうど

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_LOCATION_PERMISSION: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        Log.d(TAG,"Premission granted"); 
      }else { 
        Log.d(TAG,"Premission denied"); 
      } 
      break; 
    } 
} 
+0

こんにちはAbanoub、1)私は掲示したように実行時のアクセス許可を求める方法を知りたくありません。2)サポートライブラリを使用したくないと言っている最後の文章を読んでください。 – GoRoS

0

を上書きしますGoogleサンプルのEasyPermissionsライブラリをお試しください。権限関連のチェックを処理するので、バージョンのチェックを心配する必要はありません。

+0

こんにちはジャビタリック、答えに感謝します。私はすでにこのサンプルについて知っていましたが、「尋ねる方法」ではなく、「尋ねる方法」でなく、私の前提が正しいかどうかという論理を理解したいだけです。 – GoRoS

+0

SDKのバージョンがM未満の場合は、マニフェストで宣言するだけでアクセス権を確認する必要はありません。それがM以上であれば、 'Context#checkPermission'を使ってパーミッションをチェックしてください。許可がない場合は、許可を求めます。 – jaibatrik

関連する問題