【android開發】手機應用管理器的實現之實現軟件加鎖(四)

之前幾篇文章我們介紹瞭如何去獲取手機應用程序列表,已經實現對應用程序的一些操作:運行、卸載、分享。這個三個功能相對是比較簡單,對於如何實現對一個應用程序加鎖,這個相對複雜一點。在一些情況下,我們想對一個軟件加鎖,來保護我們的隱私或者增加安全,比如支付寶、銀行軟件,這些軟件加鎖都是有必要。前一段時間一直忙於項目,沒對博客進行跟進,今天我們將介紹一下如何實現軟件加鎖。大家先看看實現的效果圖(我們以加鎖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<RunningTaskInfo> 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;
	}
自定義軟件盤的實現這裏將不再細說,具體請參考先前文章http://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;
    }  


在清單文件裏面別忘了添加:

<activity android:name="com.xh.ui.LockAppActivity"
            android:excludeFromRecents="true"
            android:theme="@style/AppThemeBlack">
        </activity>
        <!-- android:persistent="true" 將服務設置爲系統服務,防止被系統意外回收-->
        <service 
            android:persistent="true"
            
            android:name="com.xh.service.WatchAppService"/>


上面就是主要代碼,現在我們發現其實實現起來也是很簡單的。


由於這次代碼比較多,我就不全部貼出來了,我把鏈接發給大家,可以下載源碼。

總結:到此這個手機應用管理器就做完了,當然了還有很多bug存在,一些邏輯考慮的還不夠完整,這個大家可以運行看看,歡迎一起交流。對於附帶的資源下載,本人都是運行後沒有問題才上傳的,如果你無法運行,一般都是配置問題,有問題可以在評論中交流,在資源處評論,無法和大家進行交流。歡迎大家繼續關注……


【android開發】手機應用管理器的實現(完整版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章