1

Android アプリで Device Policy Manager を使用していますが、ハニカム デバイスに問題があります。resetPassword を呼び出そうとすると、例外がスローされます。これは、Froyo や Gingerbread には当てはまりません。どちらも正常に機能します。

エラーは次のとおりです。

java.lang.RuntimeException: レシーバー Package.Name.Test を開始できません: java.lang.SecurityException: 権限の拒否: com.android.providers.settings.SettingsProvider uri content://settings/secure from pid=x, uid= の書き込みy は android.permission.WRITE_SETTINGS が必要です

私のAndroidコードは次のとおりです。

DevicePolicyManager mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);

if ((mDPM.getActiveAdmins() != null) && (mDPM.isAdminActive(new ComponentName(context, DeviceAdmin.class)))) {
    mDPM.resetPassword(extra, DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
    mDPM.lockNow();
} else {
    Log.d(TAG, "Could not lock because device admin not enabled");
}

問題は次の場所で発生します。

mDPM.resetPassword(extra, DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);

私の Device_Admin.xml は次のとおりです。

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <force-lock />
        <wipe-data />
        <reset-password />
    </uses-policies>
</device-admin>

私が言ったように、デバイス管理者は Froyo と Gingerbread デバイスでうまく機能しますが、異なるキーガードを使用しているユーザーにはいくつか問題があります.Droid X と HTC Sense. この問題はタイミングにあります。lockNow を呼び出すと、デバイスは画面をオフにしますが、HTC Sense または MotoBlur は、[設定]、[セキュリティ]、[後で電話をロックする] で設定された時間までキーガードを実際にロックしません。

どんな助けでも素晴らしいでしょう!最近 I/O でハニカム タブレットを入手したばかりで、このデバイスでアプリをまだテストしていませんが、Xoom 3.0 を実行しているユーザーのマーケット Web サイトでエラーが表示されます。3.1 デバイスはまだ見たことがありません。

4

4 に答える 4

2

私もこれに苦労しました。解決策はあなたのリンクの1つにもリストされていますが、他の誰かを助ける場合に備えて、ここでも言及します。

  • デバイスが新品(または工場出荷時のリセット)の場合、説明どおりにコードは失敗します。

  • ユーザーが設定メニューを使用してパスワードを1回だけ入力すると、どういうわけか同じコードが機能し始め、機能し続けます。

確かに非常に奇妙なバグ!

于 2011-12-20T03:52:49.990 に答える
1

私もこの問題に直面しました。パスワードを一度でも手動で設定しなかった場合、write_settings 許可を求める強制終了が発生しますが、そこからパスワードを手動で設定して一度試してみると、魅力のように働きます。

于 2012-02-20T11:48:02.013 に答える
1

Android Honeycomb 3.0 プラットフォームでは、 Gingerbread とDevicePolicyServiceManager大きく異なります。全体の流れresetPassword()は次のとおりです。

DevicePolicyServiceManager.resetPassword() --> 
LockPatternUtils.checkPasswordInHistory() --> 
LockPatternUtils.passwordToHash() --> 
LockPatternUtils.getSalt() --> 
LockPatternUtils.putLong(SALT_KEY, salt) --> 
Settings.Secure.putLong(SALT_KEY, salt)

WRITE_SETTINGSここでが必要な理由を知っておく必要があります。これは Google の間違いのようです。Google はLockPatternUtils.checkPasswordInHistory()メソッドをBinder.clearCallingIndentity()ブロックに入れませんでした。

もう1つ、ファイルにWRITE_SETTINGS許可を追加しても、許可も必要であることがわかります。AndroidManifest.xmlWRTITE_SECURE_SETTINGS

Google がこの問題をできるだけ早く修正できることを願っています。

PS この問題は ICS プラットフォームで修正されたようです。Google は、resetPassword() ブロックから checkPasswordInHistory() を削除しました。これは良いソリューションだとは思いませんが、その理由がわかりません。ICS をできるだけ早くリリースしたいのではないでしょうか。

于 2011-11-02T15:55:31.440 に答える
0

私はこの問題(3.1でも簡単に再現可能です)を見ていましたが、提出した問題に基づいて、すでに理解しているようです。他の誰かが答えを調べようとした場合に備えて、ここで注意したいと思います。

于 2011-05-24T23:59:30.563 に答える