13

この例外を回避する方法

E/AndroidRuntime(26113): Caused by: java.lang.SecurityException: No active admin owned by uid XXXX for policy #3

これを呼び出すとき:

public static void lockScreen(Context context) {
    Log.d(TAG, "lockScreen");
    ComponentName mDeviceAdminSample = null;
    DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
    dpm.lockNow();
}
4

6 に答える 6

5

リファレンスドキュメントの説明に従って、デバイス管理者をインストールして有効にする必要があります:http: //developer.android.com/guide/topics/admin/device-admin.html

于 2012-06-06T02:40:02.903 に答える
2

次の行に注意してください。

        Intent it = new         Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        it.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, new ComponentName(this, YourAdminReceiver.class));
        startActivityForResult(it, 0);

スキップできます。アプリが画面をロックすることをユーザーに許可したくない場合は、別の方法があります。

adb shell dpm set-device-owner com.package/.YourAdminReceiver

これは、OP が遭遇した SecurityException とどのような関係があるのでしょうか?

まあ、私はすでに com.package/.YourAdminReceiveradbシェルの方法でデバイス所有者を設定していましたが、画面ロックとは異なる目的でした。<force-lock>タグを device-admin.xml に追加すると、次のようになります。

<uses-policies>
        <limit-password />
        <reset-password />
        <force-lock />
    </uses-policies>

当然、locknow()API 呼び出しが機能することを期待していましたが、そうではありませんでした。SecurityExceptionOPと同じように取得しました。私のアプリがすでにデバイスの管理者および所有者であったことを考えると、奇妙で​​す。デバイス所有者の役割から設定を解除し、アンインストールしてから再インストールすることで機能させました。adb シェルを介してデバイス所有者として設定されたアプリは、コードからのみそのロールから設定解除できることに注意してください。

//        mDpm.clearDeviceOwnerApp(getPackageName());
//        mDpm.removeActiveAdmin(deviceAdmin);
于 2017-01-10T14:11:15.287 に答える
0

私の場合、デバイス管理者は、アプリ自体ではなく、インストルメンテーション テストの一部でした。Android がアクセス許可を処理する方法のバグであることが判明しました。修正は、デバイス管理クラス、マニフェスト、およびポリシーをターゲット アプリに移動することでした。確かに理想的ではありませんが、それを回避する方法がわかりません。

于 2020-06-27T12:34:05.407 に答える