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<String> lockPackageName = new ArrayList<String>(); lockPackageName = getLockedPkgs(); /*android.util.Log.d("illa","List<String> 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<String> getLockedPkgs(){ ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null); ArrayList<String>lockPkgs = new ArrayList<String>(); 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; }
今天就到这里,希望以上代码可以对阅读者有所启发。我们来日方长!