之前幾篇文章我們介紹瞭如何去獲取手機應用程序列表,已經實現對應用程序的一些操作:運行、卸載、分享。這個三個功能相對是比較簡單,對於如何實現對一個應用程序加鎖,這個相對復雜一點。在一些情況下,我們想對一個軟件加鎖,來保護我們的隱私或者增加安全,比如支付寶、銀行軟件,這些軟件加鎖都是有必要。前一段時間一直忙於項目,沒對博客進行跟進,今天我們將介紹一下如何實現軟件加鎖。大傢先看看實現的效果圖(我們以加鎖UC為例):
UC之前顯示沒有加鎖狀態 選擇加鎖UC 運行UC顯示驗證頁面
一、實現流程:
首先我們將要加鎖的應用程序放到數據庫中,然後開啟一個服務監聽棧頂應用程序,將當前棧頂應用程序與數據庫加密應用程序進行匹配,匹配成功,則彈出身份驗證頁面。
我們需要註意的是身份驗證通過之後,不能重復出現驗證密碼頁面,這個需要一些邏輯上的判斷。
將要加鎖的應用程序存放到數據庫中:
String itemPackageName = item.getPackageName(); String pwd = preferencesPwd.getString("pwd", ""); if(tv_app_lock.getText().equals("加鎖")){ if(TextUtils.isEmpty(pwd)){ setPassWord(itemPackageName); }else{ handleDB.add(itemPackageName); Toast.makeText(MainActivity.this, "加鎖成功", Toast.LENGTH_SHORT).show(); } }else if(tv_app_lock.getText().equals("解鎖")){ unLock(itemPackageName); } adapter.notifyDataSetChanged();
開啟服務,用於監聽棧頂:
// 得到當前運行的任務棧,參數就是得到多少個任務棧,1就是隻拿一個任務棧 // 對應的也就是正在運行的任務棧啦 ,註意別忘瞭在清單文件中添加獲取的權限 List runTaskInfos = activityManager.getRunningTasks(1); //拿到當前運行的任務棧 RunningTaskInfo runningTaskInfo = runTaskInfos.get(0); //拿到要運行的Activity的包名 String runningpackageName = runningTaskInfo.topActivity.getPackageName(); //判斷監聽的運行包是否加鎖 if(handleDB.find(runningpackageName)){ runningApp = runningpackageName; //解決反復出現驗證頁面BUG: //如果runningApp.equals(lastRunningApp)=true //則說明當前棧頂運行的程序已經解鎖瞭 if((runningApp.equals(lastRunningApp)) == false){ intentLockAppActivity.putExtra("packageName", runningpackageName); intentLockAppActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intentLockAppActivity); } }
監聽到要加鎖的程序,彈出驗證頁面:
String input = etInputPwd.getText().toString().trim(); preferences = getSharedPreferences("passWord", MODE_PRIVATE); passWord = preferences.getString("pwd", ""); if(TextUtils.isEmpty(input)) { Toast.makeText(this, "密碼不能為空", Toast.LENGTH_SHORT).show(); } else if(passWord.equals(input)) { WatchAppService.lastRunningApp = WatchAppService.runningApp;//這裡賦值,終於解決瞭反復彈出驗證頁面的BUG finish(); } else { Toast.makeText(this, "密碼錯誤", Toast.LENGTH_SHORT).show(); etInputPwd.setText("");//置空 }
彈出自定義軟鍵盤:
@Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub //這樣是在觸摸到控件時,軟鍵盤才會顯示出來 int inputback = etInputPwd.getInputType(); etInputPwd.setInputType(InputType.TYPE_NULL); new KeyboardUtil(this, this, etInputPwd).showKeyboard(); etInputPwd.setInputType(inputback); return false; }
自定義軟件盤的實現這裡將不再細說,具體請參考先前文章https://blog.csdn.net/acrambler/article/details/13020057
第一次進行加鎖,會要求先設置密碼:
//設置密碼 public void setPassWord(final String itemPackageName){ new AlertDialog.Builder(this).setTitle("設置安全鎖密鑰").setIcon(R.drawable.ic_setting_pwd) .setView(viewSetPwd) .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub if((etPwd1.getText().toString()).equals(etPwd2.getText().toString())){ if(TextUtils.isEmpty(etPwd1.getText().toString()) | TextUtils.isEmpty(etPwd2.getText().toString())){ Toast.makeText(MainActivity.this, "密碼不能為空", Toast.LENGTH_SHORT).show(); boolean isVisible = false; dialogView(dialog,isVisible); }else{ editor.putString("pwd", etPwd1.getText().toString()); editor.commit(); handleDB.add(itemPackageName); Toast.makeText(MainActivity.this, "密碼設置成功", Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this, "加鎖成功", Toast.LENGTH_SHORT).show(); boolean isVisible = true; dialogView(dialog,isVisible); } }else{ etPwd1.setText(""); etPwd2.setText(""); Toast.makeText(MainActivity.this, "兩次密碼不相同", Toast.LENGTH_SHORT).show(); boolean isVisible = false; dialogView(dialog,isVisible); } } }) .setNeutralButton("重置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub etPwd1.setText(""); etPwd2.setText(""); boolean isVisible = false; dialogView(dialog,isVisible); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub boolean isVisible = true; dialogView(dialog,isVisible); } } ) .create().show(); }
我們設置瞭長按進行重新設置密碼:
@Override public boolean onLongClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.ll_app_lock: String stringPwd = preferencesPwd.getString("pwd", ""); if(TextUtils.isEmpty(stringPwd)){ //沒有首次設置密碼,長按無效 }else{ changePwd(); } break; default: break; } return true; }
在清單文件裡面別忘瞭添加:
上面就是主要代碼,現在我們發現其實實現起來也是很簡單的。
由於這次代碼比較多,我就不全部貼出來瞭,我把鏈接發給大傢,可以下載源碼。
總結:到此這個手機應用管理器就做完瞭,當然瞭還有很多bug存在,一些邏輯考慮的還不夠完整,這個大傢可以運行看看,歡迎一起交流。對於附帶的資源下載,本人都是運行後沒有問題才上傳的,如果你無法運行,一般都是配置問題,有問題可以在評論中交流,在資源處評論,無法和大傢進行交流。歡迎大傢繼續關註……
【android開發】手機應用管理器的實現之實現軟件加鎖(四)