Android O版本 应用锁功能

hi !what s up!

公司在开发android O版本,分配了一个应用锁功能给我,现在在这里跟大家一起分享


需求:应用锁功能(主要功能是在打开某个app的锁的时候,弹出密码锁)

心路历程:看到这个功能第一时间想的是在哪个位置拦截可以挡住所有的app,左思右想决定在Activity.java里面来写,因为所有的Activity肯定会继承这个类。想通了这一点其他的也就一步步迎刃而解。

主要逻辑:Activity onResume 的时候去get当前的包名,然后跟存在数据库里面加锁的包名遍历对比,如果有包含在数据库里,即弹出密码界面,如果没有,正常打开Activity。


主要代码:frameworks\base\core\java\android\app\Activity.java

		//add by illa for applock
		KeyguardManager mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
		Intent intentKeyguard = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);
		
		
		String lastPackageName = Settings.System.getString(getContentResolver(), "lastName");
		android.util.Log.d("illa","onResume!"+"\ngetPackageName() = "+getPackageName()+"\tlastPackageName = "+lastPackageName);
		android.util.Log.d("illa","onResume!"+"\ngetClassName = "+getComponentName().getClassName());
					
			List lockPackageName = new ArrayList();
			lockPackageName = getLockedPkgs();
			
			/*android.util.Log.d("illa","List size = "+lockPackageName.size());
			android.util.Log.i("illa", "lockPackageName.size() > 0 = " + (lockPackageName.size() > 0));
			android.util.Log.i("illa", "getComponentName().getClassName() = " + (getComponentName().getClassName().equals("com.android.settings.applock.SetLockApp")));
			android.util.Log.i("illa", "(intentKeyguard != null) = " + (intentKeyguard != null));
			android.util.Log.i("illa", "(lastPackageName == null) = " + (lastPackageName == null));
			android.util.Log.i("illa", "mKeyguardManager.inKeyguardRestrictedInputMode = " + !mKeyguardManager.inKeyguardRestrictedInputMode());*/
			if((lockPackageName.size() > 0) && (getComponentName().getClassName().equals("com.android.settings.applock.SetLockApp"))
				&& (intentKeyguard != null) &&(lastPackageName == null)&& !mKeyguardManager.inKeyguardRestrictedInputMode()){ //
				
				intentKeyguard.putExtra("packagename", getPackageName());
				intentKeyguard.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				intentKeyguard.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
				startActivityForResult(intentKeyguard, 11111);
				
				android.util.Log.i("illa", "sendBroadcast(intent)");
			}
			/*android.util.Log.i("illa", "lockPackageName.contains(getPackageName()) = " + lockPackageName.contains(getPackageName()));
			android.util.Log.i("illa", "intentKeyguard != null = " + (intentKeyguard != null));
			android.util.Log.i("illa", "lastPackageName == null = " + (lastPackageName == null));
			android.util.Log.i("illa", "equals InCallActivity = " + !getComponentName().getClassName().equals("com.android.incallui.InCallActivity"));
			android.util.Log.i("illa", "!mKeyguardManager.inKeyguardRestrictedInputMode()) = " + !mKeyguardManager.inKeyguardRestrictedInputMode());*/		
			if (lockPackageName.contains(getPackageName()) && intentKeyguard != null &&
				    lastPackageName == null && !getComponentName().getClassName().equals("com.android.incallui.InCallActivity")
					&& !mKeyguardManager.inKeyguardRestrictedInputMode()) {
				
				intentKeyguard.putExtra("packagename", getPackageName());
				intentKeyguard.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				intentKeyguard.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
				startActivityForResult(intentKeyguard, 11111);
				
				
				android.util.Log.i("illa", "sendBroadcast(intent)");
			}
			
			String launcherPackagename = getLauncherPackageName(this);
			if(launcherPackagename != null) {
		    if(getPackageName().equals(launcherPackagename)) {
			    //Settings.System.putString(getContentResolver(), "lastName", null);
				Intent intent = new Intent("fprint.receiver.update.last_package_name");  
				intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
				intent.setPackage("com.android.settings");
                sendBroadcastAsUser(intent, UserHandle.SYSTEM);
				android.util.Log.i("illa", "last name = null");
			}


数据库那块的代码 就不贴了, 后续补充如何写数据库,


这里用到了一个内容提供者读取数据库代码如下

	private Uri uri = Uri.parse("content://com.android.settings.lockapp_provider/lockapp");
	private String COLUMN_PKGNAME = "pkgname";
	private String COLUMN_ISLOCKED = "islocked";
	
	private ArrayList getLockedPkgs(){
		ContentResolver resolver = getContentResolver();
		Cursor cursor = resolver.query(uri, null, null, null, null);
		ArrayListlockPkgs = new ArrayList();
		
		if(cursor != null){
//			cursor.moveToFirst();
			int pkg_index = cursor.getColumnIndex(COLUMN_PKGNAME);
			int lock_index = cursor.getColumnIndex(COLUMN_ISLOCKED);
			while (cursor.moveToNext()) {
				String pkgName = cursor.getString(pkg_index);
				String isLocked = cursor.getString(lock_index);
				Log.e("illa", "pkgName->"+pkgName + " || isLocked:" + isLocked);
				if("1".equals(isLocked)){
					lockPkgs.add(pkgName);
				}
			}
			cursor.close();	
		}
		return lockPkgs;
	}


今天就到这里,希望以上代码可以对阅读者有所启发。我们来日方长!


你可能感兴趣的:(Android功能)