2017-06-28 14 views
2

次のいずれかの方法で、自分のアプリに特定の権限があるかどうかを確認できます。Androidで許可チェックを行うには、ContextCompatまたはPermissionCheckerを選択する必要がありますか?

どちらがお勧めですか?

ContextCompat(LIB support-compatから):(support-core-utils LIBから)

ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) 

またはPermissionChecker:(25.3.1のように)-core-utilsのは-compatに依存すること

PermissionChecker.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) 

注:

| | +--- com.android.support:support-core-utils:25.3.1 | | | +--- com.android.support:support-annotations:25.3.1 | | | \--- com.android.support:support-compat:25.3.1 (*)

+2

個人的には、私は 'ContextCompat'を使います。私は 'PermissionChecker'でそれを選択する理由はありませんが、私はまだ問題はありませんでした。 –

+1

合意。私は 'PermissionChecker'の必要性を見ていませんでした。 – CommonsWare

+0

私はソースを読み、いくつかを学んだ。 'ContextCompat'のように見えます。 –

答えて

4

我々はそれが最初Context#checkPermissionに通じ呼び出し、呼び出し元のコードがない場合はベイルが早くないが権限を持っていることがわかりますPermissionCheckerの元に足を踏み入れます。呼び出し元コードにアクセス権がある場合は、permissionToOpがあるかどうかを尋ねる不思議なAppOpsManagerに行き、その後に戻り値noteProxyOpをチェックします。 IPCを取り扱う際

別のアプリケーションに代わって操作を実行するアプリケーションをメモしておいてください:これはとnoteProxyOp開始のためのドキュメントがあるため、私たちはこのメソッドは何のためにあるのかについてのヒントを提供します。

さらに、我々は、我々は3つの可能な結果の背面1見るPermissionCheckerメソッドの戻り値をチェックした場合:

PERMISSION_GRANTEDまたはPERMISSION_DENIEDまたはPERMISSION_DENIED_APP_OPのいずれかであるパー​​ミッションチェックの結果。

つまり、0、-1または-2の戻り値です。このクラスは、プロセス間通信を受け取り、他のアプリケーションに代わってアクションを実行するアプリケーションで使用するように意図されています。一方

ContextCompat

は、単に現在のプロセスIDをつかみ、直接 Context#checkPermissionの結果を返す:

所定のPID/UIDはその権限を許可されている場合PERMISSION_GRANTED、またはPERMISSION_DENIEDそうでない場合。標準のAndroidアプリを書いて、ほとんどの開発者にとってので

使用ContextCompat

1

私はContextCompatとなる予定です。
しかし、私は次のように読んでいます:
あなたのデバイスがAndroid M以上で動作していて、targetSdkVersionが22未満の場合、2つの間に若干の違いがあります。
あなたがオフに設定され、デバイスの許可を得て、初めてアプリケーションを起動すると以下のように、行動は次のとおりです。

  1. ContextCompat:GRANTED返すか、PERMISSION_DENIED_APP_OP

:常に許可

  • PermissionCheckerを返します。これを使用してPermissionCheckerを使用することは賢明かもしれませんが、再度実行時アクセス許可を実装するには、targetSdkVersionを23以上に設定する必要があります。

  • +0

    あなたが 'PERMISSION_DENIED_APP_OP'を得て、あなたのcompileSdkが22以下であれば、あなたのコードはそれを可能性として考慮していない可能性もあります - その定数はSDK23で追加されました。 –

    +0

    あなたはcompileSdk 22を持っていてContextCompat (ユーザーがアクセスを無効にしている場合でも)_first_ timeにはいつも 'GRANTED'を取得します。その後のコールで 'DENIED'を取得しますか?あなたのマニフェストでパーミッションを宣言し、細かいパーミッションについて "認識"していなくても、パーミッションを常に持っている必要がありますが、拒否されたAPIをコールすると、私はこれについていくつかのテストをします。 –

    +1

    @AdamS 申し訳ありませんが、私が言ったように、どこか読んでいます。私はまだ妥当性をチェックしていない。 残念ながら日本語のソースがあります。 http://sys1yagi.hatenablog.com/entry/2015/11/07/185539 –

    関連する問題