用户多次输入错误模式时如何设置限制?

时间:2016-10-12 07:30:36

标签: android

Currentlly我正在实现模式锁定应用程序,我想在用户多次输入错误模式时设置限制。例如,如果用户在此时输入错误模式设置限制(3或4时限)并设置延迟30秒及之后30秒允许进入模式。

所以,如果有人知道我怎么做,请说明一下。

这是我的收件人

public class LockScreenReceiver extends DeviceAdminReceiver {
    Context context;

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        Log.i("Action...","..."+action);

        //If the screen was just turned on or it just booted up, start your Lock Activity
        if(action.equals(Intent.ACTION_SCREEN_OFF) || action.equals(Intent.ACTION_BOOT_COMPLETED))
        {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

    @Override
    public void onPasswordFailed(Context ctxt, Intent intent) {
        DevicePolicyManager mgr = (DevicePolicyManager) ctxt.getSystemService(Context.DEVICE_POLICY_SERVICE);
        int no = mgr.getCurrentFailedPasswordAttempts();

        if (no >= 3) {
            context.startActivity(new Intent(context,ChangeActivity.class));
        }
    }

}

服务

public class LockScreenService extends Service {
    DeviceAdminReceiver receiver;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    // Register for Lockscreen event intents
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        receiver = new LockScreenReceiver();
        registerReceiver(receiver, filter);
        startForeground();
        return START_STICKY;
    }

    // Run service in foreground so it is less likely to be killed by system
    private void startForeground() {
        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle(getResources().getString(R.string.app_name))
                .setTicker(getResources().getString(R.string.app_name))
                .setContentText("Running")
                .setContentIntent(null)
                .setOngoing(true)
                .build();
        startForeground(9999,notification);
    }

    @Override
    @SuppressWarnings("deprecation")
    public void onCreate() {
        KeyguardManager.KeyguardLock key;
        KeyguardManager km = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);

        //This is deprecated, but it is a simple way to disable the lockscreen in code
        key = km.newKeyguardLock("IN");

        key.disableKeyguard();

        //Start listening for the Screen On, Screen Off, and Boot completed actions
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_BOOT_COMPLETED);

        //Set up a receiver to listen for the Intents in this Service
        receiver = new LockScreenReceiver();
        registerReceiver(receiver, filter);

        super.onCreate();
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(receiver);
        super.onDestroy();
    }
}

活动

public class MainActivity extends ActionBarActivity {
    private Lock9View lock9View;

    private static String MY_PREFS_NAME = "PatternLock";
    private static String PATTERN_KEY;
    SharedPreferences prefs;
    Button btnChange;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startService(new Intent(MainActivity.this, LockScreenService.class));
        makeFullScreen();
        setContentView(R.layout.activity_main);

        btnChange = (Button)findViewById(R.id.btnChange);
        btnChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent in = new Intent(MainActivity.this,ChangeActivity.class);
                startActivity(in);
            }
        });


        prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        lock9View = (Lock9View) findViewById(R.id.lock_9_view);

        lock9View.setCallBack(new Lock9View.CallBack() {

            @Override
            public void onFinish(String password) {
                PATTERN_KEY = prefs.getString("Pattern", "invalid");
                if (PATTERN_KEY.equals("invalid")) {
                    Toast.makeText(MainActivity.this, "Options --> Create new Pattern", Toast.LENGTH_LONG).show();
                } else {
                    if (password.equals(PATTERN_KEY)) {
                        Intent startMain = new Intent(Intent.ACTION_MAIN);
                        startMain.addCategory(Intent.CATEGORY_HOME);
                        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(startMain);
                    }else{
                        Context context = getApplicationContext();
                        // Create layout inflator object to inflate toast.xml file
                        LayoutInflater inflater = getLayoutInflater();

                        // Call toast.xml file for toast layout
                        View toastRoot = inflater.inflate(R.layout.layout_toast3, null);

                        Toast toast = new Toast(context);
                        // Set layout to toast
                        toast.setView(toastRoot);
                        toast.setGravity(Gravity.HORIZONTAL_GRAVITY_MASK | Gravity.BOTTOM,
                                0, 0);
                        toast.setDuration(Toast.LENGTH_LONG);
                        toast.show();
                    }
                }  
            }
        });
    }

    private void makeFullScreen() {
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        if(Build.VERSION.SDK_INT < 19) { //View.SYSTEM_UI_FLAG_IMMERSIVE is only on API 19+
            this.getWindow().getDecorView()
                    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        } else {
            this.getWindow().getDecorView()
                    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE);
        }
    }

    @Override
    public void onBackPressed() {
        return; //Do nothing!
    }

    public void unlockScreen(View view) {
        //Instead of using finish(), this totally destroys the process
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

那么,我怎么能做到这一点......

2 个答案:

答案 0 :(得分:1)

有一个像failedCounter这样的int字段,并在每次用户输入无效模式时递增它,检查是否达到限制,然后禁用输入接口并有一个处理程序在时间延迟后重置该值。

int failedCount = 0;
final static int LIMIT = 5; //set your limit here

private void invalidPattern() {
        if (++failedCount == LIMIT) {
           //disable the input
           new Handler().postDelayed(new Runnable() {
                   @Override
                   public void run() {
                         //reset the failed count
                         faildCount = 0;

                         //Enable the input interface here
                   }
           }, 30000); // 30Sec delay
        }
}

答案 1 :(得分:1)

使用这两种方法 -

    ScheduledThreadPoolExecutor c1;
private void IncorrectCallCounter() {
    if (failedCounter>=0)
    {
        c1.shutdownNow();
        LockScreenFor30Second();
    }else
    {
        if (c1!=null)
            c1.shutdownNow();
    }



    c1 = new ScheduledThreadPoolExecutor(1);
    c1.schedule(new Runnable() {
        @Override
        public void run() {
            failedCounter=0;
            c1.shutdownNow();
        }
    }, 15, TimeUnit.SECONDS);

}
ScheduledThreadPoolExecutor c2;
private void LockScreenFor30Second() {
    //Lock Screen Here
    c2 = new ScheduledThreadPoolExecutor(1);
    c2.schedule(new Runnable() {
        @Override
        public void run() {
            //Unlock Screen Here
            c2.shutdownNow();
        }
    }, 30, TimeUnit.SECONDS);
}

全局声明failedCounter

  private int failedCounter=0;

当您检测到错误的模式时调用此方法 -

 failedCounter=failedCounter+1;
    IncorrectCallCounter();

如果用户在15秒内输入错误的模式4次,则会调用LockScreenFor30Second方法。并在LockScreenFor30Second内添加您的代码。