2017-04-20 9 views
1

Android 7(Nougat)でアプリケーションを実行しているときに問題が発生しています。 私のアプリは、ユーザーが自分のパスワードを忘れたときのカスタム復旧のように機能します。これを達成するために、私のアプリは管理者権限を要求し、X番号に達するとコードが生成され、ユーザーの電子メールに送信された場合、失敗した試行の回数を監視します。デバイスポリシーマネージャを使用してAndroid 7のパスワードをリセットできない

このアプリはロリポップとマシュマロのデバイス上で正常に動作しているが、ヌガーで実行しているときには、次のエラーを提示:はjava.lang.SecurityException:ヌルパスワードを使用して呼び出すことはできません

EmailActivity:

private static final String DEFAULT_PASSWORD = ""; 
// Commented code 
DevicePolicyManager devicePolicyManager = 
      (DevicePolicyManager) getApplicationContext().getSystemService(Context.DEVICE_POLICY_SERVICE); 
devicePolicyManager.resetPassword(DEFAULT_PASSWORD, 0); 

リソースの@ XML/device_admin.xml:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> 
    <uses-policies> 
     <watch-login /> 
     <reset-password /> 
    </uses-policies> 
</device-admin> 

マニフェスト:

... 
<receiver 
    android:name="com.example.pin.AdminReceiver" 
    android:permission="android.permission.BIND_DEVICE_ADMIN" > 
    <intent-filter> 

     <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.device_admin" 
     android:resource="@xml/device_admin" /> 
</receiver> 
... 

出力ログ:

01-02 06:35:48.383 7354-7354/? E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.pin, PID: 7354 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pin/com.example.pin.EmailActivity}: java.lang.SecurityException: Cannot call with null password 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527) 
at android.os.Handler.dispatchMessage(Handler.java:110) 
at android.os.Looper.loop(Looper.java:203) 
at android.app.ActivityThread.main(ActivityThread.java:6251) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 
Caused by: java.lang.SecurityException: Cannot call with null password 
at android.os.Parcel.readException(Parcel.java:1683) 
at android.os.Parcel.readException(Parcel.java:1636) 
at android.app.admin.IDevicePolicyManager$Stub$Proxy.resetPassword(IDevicePolicyManager.java:3829) 
at android.app.admin.DevicePolicyManager.resetPassword(DevicePolicyManager.java:2242) 
at com.example.pin.EmailActivity.onCreate(EmailActivity.java:25) 
at android.app.Activity.performCreate(Activity.java:6666) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)  
at android.app.ActivityThread.-wrap12(ActivityThread.java)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)  
at android.os.Handler.dispatchMessage(Handler.java:110)  
at android.os.Looper.loop(Looper.java:203)  
at android.app.ActivityThread.main(ActivityThread.java:6251)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 

空の文字列とは別のものへDEFAULT_PASSWORD変更した場合は、例外の変更:java.lang.SecurityException:管理者は、現在のパスワードを変更することはできません

出力ログ:

04-20 22:31:18.228 8880-8880/com.example.pin E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.pin, PID: 8880 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pin/com.example.pin.EmailActivity}: java.lang.SecurityException: Admin cannot change current password 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527) 
at android.os.Handler.dispatchMessage(Handler.java:110) 
at android.os.Looper.loop(Looper.java:203) 
at android.app.ActivityThread.main(ActivityThread.java:6251) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 
Caused by: java.lang.SecurityException: Admin cannot change current password 
at android.os.Parcel.readException(Parcel.java:1683) 
at android.os.Parcel.readException(Parcel.java:1636) 
at android.app.admin.IDevicePolicyManager$Stub$Proxy.resetPassword(IDevicePolicyManager.java:3829) 
at android.app.admin.DevicePolicyManager.resetPassword(DevicePolicyManager.java:2242) 
at com.example.pin.EmailActivity.onCreate(EmailActivity.java:25) 
at android.app.Activity.performCreate(Activity.java:6666) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)  
at android.app.ActivityThread.-wrap12(ActivityThread.java)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)  
at android.os.Handler.dispatchMessage(Handler.java:110)  
at android.os.Looper.loop(Looper.java:203)  
at android.app.ActivityThread.main(ActivityThread.java:6251)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)  

Android device policy manager, reset passwordのドキュメントをすでに読み込んでいますが、何をすべきか正確には分かりませんでした。

Calling with a null or empty password will clear any existing PIN, pattern or password if the current password constraints allow it. Note: This will not work in N and later for managed profiles, or for device admins that are not device owner or profile owner. Once set, the password cannot be changed to null or empty except by these admins.

私はいくつかの研究とテストを行うことが、私は私のデバイス管理アプリがデバイスの所有者またはプロファイルの所有者になるようにする方法を見つけることができませんでした。どのようにこの問題を解決するの任意のアイデア?

ありがとうございます!

+0

解決策があれば私も同じ問題を抱えています。事前に教えてください。 –

+0

申し訳ありませんが、私にとってはうまくいく解決策を見つけることができませんでした。 –

+0

この問題を解決する必要があるので、この場合はどうすればよいですか。 –

答えて

0

あなたのアプリがデバイスまたはプロフィールの所有者である場合は、そのデバイスまたはプロフィールがまだプロビジョニングされていないことが必要です。そのため、「標準」アプリ使用モデル(Playストア/ウェブサイト&からダウンロード可能それを望むユーザー)、これはあなたのための選択肢ではありません。企業シナリオの場合、デバイスやプロファイルの所有者を適切に実装する方法を検討する必要があります。次に、adbを使ってアプリケーションを所有者に設定できますが、デバイスを工場出荷時にリセットする必要があります(少なくともデバイスの所有権については)。プロファイル所有権は、メイン/プライベートプロファイルとは別の作業プロファイルを意味します。あなたのメインプロファイルのパスワードをリセットしたいと思うように聞こえますが、これはあなたができないように思えます。 Androidのドキュメントから

2

https://developer.android.com/about/versions/nougat/android-7.0-changes.html

は、「デバイス管理者用パスワード制限をリセットし、今所有者のプロファイルを適用するデバイスの管理者は、もはやパスワードをクリアするか、すでに設定されているものを変更するDevicePolicyManager.resetPassword()を使用することはできませんデバイス。管理者はパスワードを設定することができますが、パスワード、PIN、パターンがない場合にのみパスワードを設定できます。


私は同じ問題を観察します。 パスワードがない場合、resetpasswordが機能します。 パスワードのクリアに失敗します。 パスワードの変更も失敗します。

関連する問題