6

複数選択問題:

アプリケーションが AndroidManifest.xml で宣言された特定の権限を持っているかどうかを正しくチェックするのは、次のうちどれですか?

getContext().checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

また

getContext().getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getContext().getPackageName()) == PackageManager.PERMISSION_GRANTED

基本的に、私はどのクレームのAndroidドキュメントから怖がっていcheckCallingOrSelfPermissionますか? それは一体何の意味ですか? http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)

したがって、真の違いに関する説明は素晴らしいでしょう:D

*注: このコードはライブラリで提供しているため、より良い方法を知らない限り、実行時にのみアクセス許可を確認できます。

4

3 に答える 3

4

私の理解から(私はまだIPCをあまり扱っていないので、これは間違っているかもしれません):

コードが別のアプリケーションから実行されている場合 (たとえば、ライブラリはアプリケーションにコンパイルされていませんが、サード パーティに公開されているBinderか、またはそのようなものを使用している場合) checkCallingPermission、サード パーティのアプリケーションに特定のアクセス許可があるかどうかを確認するために使用できcheckCallingOrSelfPermissionます。ライブラリがコンパイルされたアプリケーションからのアクセス許可。

呼び出し元のアクセス許可を個別に処理する必要があるのは、自分のアクセス許可を確認するときに他のアプリケーションにアクセス許可を漏らす可能性があるためです。セキュリティのヒントから:

権限で保護されたデータを漏らさないでください。これは、アプリが特定のアクセス許可を持っているためにのみ利用できるデータを IPC 経由で公開する場合に発生しますが、IPC インターフェースのクライアントのそのアクセス許可は必要ありません。

[...]

アクセス制御を必要とするインターフェイスを提供する場合は checkCallingPermission()、呼び出し元が必要なアクセス許可を持っているかどうかを確認するために使用します。これは、アプリケーションの ID が他のインターフェースに渡されるため、呼び出し元に代わってサービスにアクセスする前に特に重要です。

あなたが説明するパッケージマネージャーの方法は、ライブラリがコンパイルされたアプリケーションの権限のみをチェックします。

したがって、コードが別のプロセスから実行されない場合は、おそらく違いを気にする必要はありません。それ以外の場合は、パッケージ マネージャーの方法を使用するか、タスクを実行できるどうかに関心がある場合は、呼び出し元の ID をクリアします。呼び出しプロセスもタスクを実行できるかどうかを確認したい場合は、呼び出し元のアクセス許可も確認してください。

于 2013-08-23T02:03:23.080 に答える