android 在4.0以前,解锁界面是采用横滑的方式,在4.0之后,就采用了中心圆环的解锁方式,4.0和4.1都是有三个图标的,分别是:向上的google搜索应用,向左的拍照应用以及向右的正常解锁功能。但有时候,客户会要求改成他们自己所需要的解锁应用。下面我们来看一下,该如何修改系统给定的锁屏界面。
首先来说,要定制自己的锁屏界面,会有两种方式:
第一,基于源码来修改;
第二,定制自己的第三方应用开发。
在源码下修改,是相对要简单很多的,但是需要准备的也是更多的,首先是需要有源码,再者需要有搭建好的源码编译环境。基于第三方的应用开发,要做的东西就相对较多一下,比如电量、时间、天气等只要在锁屏界面能看到的一切东西都需要自己去做,同时,在将应用嵌入到设备时,你要将系统原声的锁屏界面干掉。
这里介绍修改系统源码的方式
首先,来看资源文件arrays.xml,该文件在目录:framework/base/core/res/res/values下。先看代码
<span style="font-size: 18px;"> </span><span style="font-size:12px;"> <array name="lockscreen_targets_with_camera">
<item>@drawable/ic_lockscreen_unlock</item>
<item>@drawable/ic_action_assist_generic</item>
<item>@drawable/ic_lockscreen_camera</item>
<item>@null</item>
</array></span>
这个数组是在4.0 和4.1中引用的,也就是分别对应的向上的google应用(当然,实际代码中是对应到搜索应用的,在Android 设备中google是默认的搜索应用),向左的拍照以及向右的正常解锁。
<array name="lockscreen_targets_unlock_only">
<item>@android:drawable/ic_lockscreen_unlock</item>
</array>
这个就是4.2之后的单一向右解锁界面所使用的数组。
使用这两个数组的布局则是:keyguard_glow_pad_view.xml,在framework/base/core/res/res/layout/文件夹下
<!-- This is the selector widget that allows the user to select an action. -->
<com.android.internal.widget.multiwaveview.GlowPadView
xmlns:prvandroid="http://schemas.android.com/apk/prv/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/glow_pad_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:contentDescription="@string/keyguard_accessibility_slide_area"
android:gravity="@integer/kg_selector_gravity"
android:orientation="horizontal"
prvandroid:allowScaling="true"
prvandroid:directionDescriptions="@*android:array/lockscreen_direction_descriptions"
prvandroid:feedbackCount="1"
prvandroid:firstItemOffset="@integer/kg_glowpad_rotation_offset"
prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius"
prvandroid:handleDrawable="@*android:drawable/ic_lockscreen_handle"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:magneticTargets="true"
prvandroid:outerRadius="@*android:dimen/glowpadview_target_placement_radius"
prvandroid:outerRingDrawable="@*android:drawable/ic_lockscreen_outerring"
prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot"
prvandroid:snapMargin="@*android:dimen/glowpadview_snap_margin"
prvandroid:targetDescriptions="@array/lockscreen_target_descriptions_unlock_only"
prvandroid:targetDrawables="@array/lockscreen_targets_unlock_only"
prvandroid:vibrationDuration="20" />
由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 的末尾加上一行图片资源引用就行了。
在这个地方有两个需要注意的地方,第一个是res包下各种资源都有很多个相应的包,比如values就有多达几十个包,所有一定要放对相应的包,或者你为了稳妥,可以在每个包下都加入。 第二个要注意的地方是:在4.2以后,你加入图片资源以后,不会在/values/public.xml中自动形成资源的ID,这个时候,就需要你自己加入进去。
公共资源的加入方法:例如,你加了一张图片,那么你找到drawable这部分,在最后加入一行<public type="drawable" name="mypic" id="xxxxxxxxx"/>
id一定要是上面所没有的,为了保险,你可以直接在系统原有的最后一个drawable资源的ID上加1就行,私有资源的加入方法:<java-symbol type="drawable" name="mypic" /> 私有资源是不用加 ID,系统会自己生成。
上面这块是资源的更改,资源更改完了之后,是代码里的修改,代码修改在以下文件
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 有一篇一模一样的文章,两个都是我的号