2015-12-03 12 views
13

APIレベル23が追加されましたisPermissionRevokedByPolicy() on PackageManager通常の開発者はどのようにisPermissionRevokedByPolicy()を試用しますか?

通常、デバイス所有者またはプロファイル所有者は、このようなポリシーを適用することがあります。

開発者はペテンの作業セットの全体のAndroidを経由の短い、isPermissionRevokedByPolicy()は、いくつかのパッケージ/許可の組み合わせについてfalseを復帰させるために何かできることはありますか?

+0

あなたはそれについて何かを見つけましたか?私はテストする唯一の方法は、テストDPCアプリケーションを使用することができると思います。それはオープンソースですが、1つのメソッドをテストするだけの多くの作業があります。 https://github.com/googlesamples/android-testdpc – fasteque

+0

@fasteque:いいえ、私は賞金がまだ未払いである理由は何も答えていません。私はテストDPCを「Android for Workセット全体」にまとめました。テスト用のDPCは明らかに文書化されていません。「管理用のアプリケーションのアクセス許可」ページから、isPermissionRevokedByPolicy()などの実際のAndroidのアクセス許可にマップする方法はわかりません。 – CommonsWare

答えて

7

もちろん、私は間違っているかもしれませんが、短い答えが「いいえ、ありません」と思われます。

もう少し延長答え: はここApplicationPackageManagerのコードです:

MPM
@Override 
public boolean isPermissionRevokedByPolicy(String permName, String pkgName) { 
    try { 
     return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId()); 
    } catch (RemoteException e) { 
     throw new RuntimeException("Package manager has died", e); 
    } 
} 

-

private final IPackageManager mPM; 

それはContextImpl.getPackageManager(によって呼び出されるコンストラクタで初期化されています) :

@Override 
public PackageManager getPackageManager() { 
    if (mPackageManager != null) { 
     return mPackageManager; 
    } 

    IPackageManager pm = ActivityThread.getPackageManager(); 
    if (pm != null) { 
     // Doesn't matter if we make more than one instance. 
     return (mPackageManager = new ApplicationPackageManager(this, pm)); 
    } 

    return null; 
} 

source code

)より深く行くとActivityThread.getPackageManager(に探して:

public static IPackageManager getPackageManager() { 
    if (sPackageManager != null) { 
     //Slog.v("PackageManager", "returning cur default = " + sPackageManager); 
     return sPackageManager; 
    } 
    IBinder b = ServiceManager.getService("package"); 
    //Slog.v("PackageManager", "default service binder = " + b); 
    sPackageManager = IPackageManager.Stub.asInterface(b); 
    //Slog.v("PackageManager", "default service = " + sPackageManager); 
    return sPackageManager; 
} 

source code

私はisPermissionRevokedByPolicyところでの実際の実装を見つけるためにやっていたすべての手順。それから、IPackageManager.Stubを拡張するのは、PackageManagerService(source code)です。だからここ

が実際の実装である:潜在的

@Override 
public boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId) { 
    if (UserHandle.getCallingUserId() != userId) { 
     mContext.enforceCallingPermission(
       android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, 
       "isPermissionRevokedByPolicy for user " + userId); 
    } 
    if (checkPermission(permission, packageName, userId) 
      == PackageManager.PERMISSION_GRANTED) { 
     return false; 
    } 
    final long identity = Binder.clearCallingIdentity(); 
    try { 
     final int flags = getPermissionFlags(permission, packageName, userId); 
     return (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0; 
    } finally { 
     Binder.restoreCallingIdentity(identity); 
    } 
} 

「偽物」とは、特定の許可の状況をに、あなたはのcheckPermissionとgetPermissionFlags方法をハックする必要があると思います。問題は、私は心配していますが、ApplicationPackageManagerにオーバーライドされたPackageManagerServiceを少なくともどのように反映させるかについての明確な方法はありません。

+0

ありがとうございます。取り消しを偽った私は、このメソッドが最小の労力で 'true'を返すようにしたいだけです。例えば: '' DevicePolicyManager''の '' setCameraDisabled() '](http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setCameraDisabled%28android.content.ComponentName,%20boolean%29 ) 'Manifest.permission.CAMERA'が' true'を返すための 'isPermissionRevokedByPolicy()'を引き起こしますか? 'setCameraDisabled()'は、通常のデバイス管理者が呼び出すことができます。必ずしもデバイス所有者、ポリシー所有者、その他のAndroid for Workのものである必要はありません。 – CommonsWare

+0

@CommonsWareええ、特にテキストの取り消しに重点を置いて書いていると、私はほとんど間違っているかもしれませんが、それにもかかわらず、あらゆる種類の詐欺に当てはまります。 setCameraDisabled()について - 私はそれについてもっと考えます。何かが私の心に来たら - 私は答えを更新します。 –

+0

@CommonsWare setCameraDiabled()はisPermissionRevokedByPolicy()がtrueを返さない原因となります。これは、デバイスの機能を制御する複数のAPIがある理由を本当に混乱させます。私の理解によれば、管理されたプロビジョニングは、デバイス管理と同じであり、余分なものはほとんどありません。 googleは今後の重複APIを排除すると考えているかもしれません。私が間違っているなら、私を修正してください。 – 7383

0

私は直接的な方法はないと思います。しかし、呼び出し元パッケージのランタイムpermissionstateを変更できる場合、ispermissionrevokedbypolicy()はfalseを返します。しかし、私はそれもやっかいな部分だと感じています。

関連する問題