2014-08-26 6 views
2

Я пытаюсь создать приложение для Android, которое может изменить пароль устройства. Я читал о Device Administration Application я пытаюсь запустить this sample и это мой основной код деятельности:Как сменить пароль программно?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final Activity context = this; 
    final String new_pass = ((EditText)findViewById(R.id.editext)).getText().toString(); 
    ((Button)findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      DevicePolicyManager devicePolicyManager = 
        (DevicePolicyManager)context.getSystemService(context.DEVICE_POLICY_SERVICE); 
      ComponentName demoDeviceAdmin = new ComponentName(context, MainActivity.class); 

      devicePolicyManager.setPasswordQuality(
        demoDeviceAdmin,DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); 
      devicePolicyManager.setPasswordMinimumLength(demoDeviceAdmin, 5); 

      boolean result = devicePolicyManager.resetPassword("123456", 
        DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY); 

      Toast.makeText(context, 
        "button_lock_password_device..."+result, 
        Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

и я получил эту ошибку:

08-26 22:36:51.280 15249-15249/co.rishe.secretpolice.app E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.SecurityException: No active admin ComponentInfo{com.example.secretpolice.app/com.example.secretpolice.app.MainActivity} 
     at android.os.Parcel.readException(Parcel.java:1425) 
     at android.os.Parcel.readException(Parcel.java:1379) 
     at android.app.admin.IDevicePolicyManager$Stub$Proxy.setPasswordQuality(IDevicePolicyManager.java:1359) 
     at android.app.admin.DevicePolicyManager.setPasswordQuality(DevicePolicyManager.java:323) 
     at co.rishe.secretpolice.app.MainActivity$1.onClick(MainActivity.java:32) 
     at android.view.View.performClick(View.java:4211) 
     at android.view.View$PerformClick.run(View.java:17267) 
     at android.os.Handler.handleCallback(Handler.java:615) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4898) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
     at dalvik.system.NativeStart.main(Native Method) 

Может ли один помочь мне, как я могу это исправить?

+3

В сообщении об ошибке указано, что вы не являетесь администратором устройства. –

ответ

6

Цитирование the documentation that you linked to:

One of the major events a device admin application has to handle is the user enabling the application. The user must explicitly enable the application for the policies to be enforced. If the user chooses not to enable the application it will still be present on the device, but its policies will not be enforced, and the user will not get any of the application's benefits.

Как указывает г-н Харви, сообщение об ошибке означает, что пользователь не активировал приложение в качестве администратора устройства еще.

Далее со ссылкой на документацию:

The process of enabling the application begins when the user performs an action that triggers the ACTION_ADD_DEVICE_ADMIN intent.

Here is a sample project, который демонстрирует создание администратора устройства. Ключ в LockMeNowActivity:

/*** 
    Copyright (c) 2012 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    http://commonsware.com/Android 
*/ 

package com.commonsware.android.lockme; 

import android.app.Activity; 
import android.app.admin.DevicePolicyManager; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 

public class LockMeNowActivity extends Activity { 
    private DevicePolicyManager mgr=null; 
    private ComponentName cn=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 
    cn=new ComponentName(this, AdminReceiver.class); 
    mgr=(DevicePolicyManager)getSystemService(DEVICE_POLICY_SERVICE); 
    } 

    public void lockMeNow(View v) { 
    if (mgr.isAdminActive(cn)) { 
     mgr.lockNow(); 
    } 
    else { 
     Intent intent= 
      new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
     intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, cn); 
     intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, 
         getString(R.string.device_admin_explanation)); 
     startActivity(intent); 
    } 
    } 
} 

Здесь, когда пользователь нажимает кнопку, которая вызывает lockMeNow(), я проверяю, если мое приложение является администратором устройства, и если я не привести пользователя к соответствующему месту в приложении «Настройки», чтобы решить, должно ли мое приложение быть администратором устройства.

Смежные вопросы