6

複数の選択肢の質問をチェックするには?はどのように適切にAndroidの許可を動的に

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

または

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

基本的に、私は何checkCallingOrSelfPermission請求のアンドロイド文書から怖がってました - あなたはそれをチェックした場合、それはIPCの権限を付与> ??それは一体何の意味ですか? http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)

だから本当の違い上の任意の説明は素晴らしいだろう:D

*注:私は図書館でこのコードを与えているので、あなたが知っている限り、私は、実行時にパーミッションを確認させていただいておりますもっといい方法。

あなたがこの方法を使用することができます

答えて

3

:私の理解から

//for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE" 
public boolean hasPermission(String permission) 
{ 
    try { 
     PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); 
     if (info.requestedPermissions != null) { 
      for (String p : info.requestedPermissions) { 
       if (p.equals(permission)) { 
        return true; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+0

である。これは、(もともと[この質問]のための私の答えだったhttp://stackoverflow.com/questions/18236801/programmatically-retrieve-permissions-from-manifest-xml-in-android/18237962 #18237962)。 – Phil

4

は(私はまだ、IPCとあまりうまくいかなかったとして、間違っているかもしれない):あなたのコードが別から実行されていることを

を考えますあなたのライブラリはアプリケーションにコンパイルされていませんが、Binderなどを使用して第三者に公開されている場合は、にはアプリケーションからのアクセス許可が含まれていますが、checkCallingPermissionを使用して、ライブラリがコンパイルされました。

独自のアクセス許可をチェックするときに他のアプリケーションにアクセス許可が漏洩する可能性があるため、発信者のアクセス許可を個別に処理する必要があります。 security tipsから:

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

[...]

、アクセス制御を必要と checkCallingPermission()は、発信者が必要な 権限を持っているかどうかを確認するために使用しないインタフェースを提供する場合。これは、アプリケーションの識別情報が の他のインターフェイスに渡されるため、発信者の代わりに のサービスにアクセスする前に特に重要です。あなたがチェックを記述

パッケージマネージャの道アプリケーションの唯一権限あなたのライブラリーをにコンパイルされました。

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

0

これにはContext.checkCallingorSelfPermission()を使用できます。ここでは例

private boolean checkWriteExternalPermission() 
{ 

    String permission = "android.permission.WRITE_EXTERNAL_STORAGE"; 
    int res = getContext().checkCallingOrSelfPermission(permission); 
    return (res == PackageManager.PERMISSION_GRANTED);    
} 
関連する問題