android 在4.0以前,解锁界面是采用横滑的方式,在4.0之后,就采用了中心圆环的解锁方式,4.0和4.1都是有三个图标的,分别是:向上的google搜索应用,向左的拍照应用以及向右的正常解锁功能。但有时候,客户会要求改成他们自己所需要的解锁应用。下面我们来看一下,该如何修改系统给定的锁屏界面。
首先来说,要定制自己的锁屏界面,会有两种方式:
第一,基于源码来修改;
第二,定制自己的第三方应用开发。
在源码下修改,是相对要简单很多的,但是需要准备的也是更多的,首先是需要有源码,再者需要有搭建好的源码编译环境。基于第三方的应用开发,要做的东西就相对较多一下,比如电量、时间、天气等只要在锁屏界面能看到的一切东西都需要自己去做,同时,在将应用嵌入到设备时,你要将系统原声的锁屏界面干掉。
这里介绍修改系统源码的方式
首先,来看资源文件arrays.xml,该文件在目录:framework/base/core/res/res/values下。先看代码
- @drawable/ic_lockscreen_unlock
- @drawable/ic_action_assist_generic
- @drawable/ic_lockscreen_camera
- @null
这个数组是在4.0 和4.1中引用的,也就是分别对应的向上的google应用(当然,实际代码中是对应到搜索应用的,在Android 设备中google是默认的搜索应用),向左的拍照以及向右的正常解锁。
- @android:drawable/ic_lockscreen_unlock
这个就是4.2之后的单一向右解锁界面所使用的数组。
使用这两个数组的布局则是:keyguard_glow_pad_view.xml,在framework/base/core/res/res/layout/文件夹下
由prvandroid:targetDrawables="@array/lockscreen_targets_unlock_only" 这行代码我们知道,
该文件当前引用的是 lockscreen_targets_unlock_only ,也就是4.2之后的。而我们需要改修改的则仅仅只是lockscreen_targets_unlock_only 或者 lockscreen_targets_with_camera 中的一个。
比如,在4.0的基础上,我要把向下也加上一个应用,在只需要在drawable对应的包下加入一张图片,然后在
lockscreen_targets_with_camera 的末尾加上一行图片资源引用就行了。
公共资源的加入方法:例如,你加了一张图片,那么你找到drawable这部分,在最后加入一行
id一定要是上面所没有的,为了保险,你可以直接在系统原有的最后一个drawable资源的ID上加1就行,私有资源的加入方法:
上面这块是资源的更改,资源更改完了之后,是代码里的修改,代码修改在以下文件
KeyguardSelectorView.java(4.2+) 路径是:frameworks/base/policy/src/com/android/internal/policy/impl/keyguard/
MultiWareView.java (4.0 /4.1) 路径是:frameworks/base/core/java/com/android/internal/widget/multiwaveview/
4.0/4.1 和4.2之后所修改的Java文件是不相同的,上面已经有明确的标注了。在程序中只需要修改OnTriggerListener 这个监听里的不同方向就行了。
OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
public void onTrigger(View v, int target) {
final int resId = mGlowPadView.getResourceIdForTarget(target);
switch (resId) {
case com.android.internal.R.drawable.ic_action_assist_generic:
Intent assistIntent = ((SearchManager) mContext
.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserHandle.USER_CURRENT);
if (assistIntent != null) {
mActivityLauncher.launchActivity(assistIntent, false, true,
null, null);
} else {
Log.w(TAG, "Failed to get intent for assist activity");
}
mCallback.userActivity(0);
break;
case com.android.internal.R.drawable.ic_lockscreen_camera:
mActivityLauncher.launchCamera(null, null);
mCallback.userActivity(0);
break;
case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
case com.android.internal.R.drawable.ic_lockscreen_unlock:
mCallback.userActivity(0);
mCallback.dismiss(false);
break;
}
}
public void onReleased(View v, int handle) {
if (!mIsBouncing) {
doTransition(mFadeView, 1.0f);
}
}
public void onGrabbed(View v, int handle) {
mCallback.userActivity(0);
doTransition(mFadeView, 0.0f);
}
public void onGrabbedStateChange(View v, int handle) {
}
public void onFinishFinalAnimation() {
}
};
onTrigger()的switch(resId)就是我们需要修改的地方。
4.0 /4.1的代码修改在MultiWareView.java类中,也是同样的方法。
资源和代码都修改完了之后,就可以进行编译了,在终端分别定位到两个目录下,即 /framework/core/res 和 /framework/policy/src 下进行编译 ,执行命令mm,
注意要先编译资源,再编译代码。编译完成后,会生成framework.apk文件和policy.jar文件。把这两个文件拷贝出来,通过adb push的方式,把这两个文件push到你的设备当中,命令:adb push xxx/xxx/xxx/framework.apk(apk全路径) /system/framework/ 和 adb push xxx/xxx/xxx/polilcy.jar(.jar全路径) /system/framework/
重启设备: adb reboot。 等待开机,那么就OK了。以上就是通过修改系统源码的方式修改开锁界面的全过程。
对于通过第三方的应用来修改,参考下面这篇文章:http://blog.csdn.net/stevenhu_223/article/details/8831534
另:账号dancing_with_wolf 有一篇一模一样的文章,两个都是我的号