2015年5月4日 星期一

鎖屏 (Screen Lock or Keyguard)上,增加其它icon

環境:4.4.2 frameworks/base/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java
public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
...
...
    public void onTrigger(View v, int target) {
            final int resId = mGlowPadView.getResourceIdForTarget(target);

            switch (resId) {
                case R.drawable.ic_action_assist_generic:
                    Intent assistIntent =
                            ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
                            .getAssistIntent(mContext, true, 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 R.drawable.ic_lockscreen_camera:
                    mActivityLauncher.launchCamera(null, null);
                    mCallback.userActivity(0);
                    break;

                //參考camera,再復製一個出來即可
                case R.drawable.ic_lockscreen_abc:
                    mActivityLauncher.launchNNTest();
                    mCallback.userActivity(0);
                    break;
case R.drawable.ic_lockscreen_unlock_phantom: case R.drawable.ic_lockscreen_unlock: mCallback.userActivity(0); mCallback.dismiss(false); break; } } }
frameworks/base/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java
public abstract class KeyguardActivityLauncher {
...
...
private static final Intent MYINTENT = new Intent ();
public void launchCamera(Handler worker, Runnable onSecureCameraStarted) {
        LockPatternUtils lockPatternUtils = getLockPatternUtils();

        // Workaround to avoid camera release/acquisition race when resuming face unlock
        // after showing lockscreen camera (bug 11063890).
        KeyguardUpdateMonitor.getInstance(getContext()).setAlternateUnlockEnabled(false);

        if (lockPatternUtils.isSecure()) {
            // Launch the secure version of the camera
            if (wouldLaunchResolverActivity(SECURE_CAMERA_INTENT)) {
                // TODO: Show disambiguation dialog instead.
                // For now, we'll treat this like launching any other app from secure keyguard.
                // When they do, user sees the system's ResolverActivity which lets them choose
                // which secure camera to use.
                launchActivity(SECURE_CAMERA_INTENT, false, false, null, null);
            } else {
                launchActivity(SECURE_CAMERA_INTENT, true, false, worker, onSecureCameraStarted);
            }
        } else {
            // Launch the normal camera
            launchActivity(INSECURE_CAMERA_INTENT, false, false, null, null);
        }
    }

    public void launchNNTest() {
        MYINTENT.setClassName("com.main","com.main.MainActivity");
        launchActivity(MYINTENT, false, false, null, null);
    }
}
setClassName(Context packageContext, String className)
對apk右鍵兩下,可以看到AndroidManifest.xml
利用反組譯來取得package和classname
命令:java -jar AXMLPrinter2.jar AndroidManifest.xml > test.txt
下載:AXMLPrinter2.jar

圖片的位置:
frameworks/base/packages/Keyguard/res/drawable/ic_lockscreen_camera.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="true"
        android:state_active="false"
        android:state_focused="false"
        android:drawable="@drawable/ic_lockscreen_camera_normal" />
    <item
        android:state_enabled="true"
        android:state_active="true"
        android:state_focused="false"
        android:drawable="@drawable/ic_lockscreen_camera_activated" />
    <item
        android:state_enabled="true"
        android:state_active="false"
        android:state_focused="true"
        android:drawable="@drawable/ic_lockscreen_camera_activated" />
</selector>
res/layout/keyguard_glow_pad_view.xml
<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:orientation="horizontal"
    android:gravity="@integer/kg_selector_gravity"
    android:contentDescription="@string/keyguard_accessibility_slide_area"

    prvandroid:targetDrawables="@array/lockscreen_targets_unlock_only  //讀取資料,如下"
    prvandroid:targetDescriptions="@array/lockscreen_target_descriptions_unlock_only"
    prvandroid:directionDescriptions="@array/lockscreen_direction_descriptions"
    prvandroid:handleDrawable="@drawable/ic_lockscreen_handle"
    ....
    ....
/>
裡面還有其它設定
res/values/arrays.xml (裡面還有其它的,可以自行擇一)
<array name="lockscreen_targets_unlock_only">
    <item>@drawable/ic_lockscreen_unlock</item>  //上
    <item>@drawable/ic_lockscreen_aaa</item>       //右
    <item>@drawable/ic_lockscreen_abb</item>      //下
    <item>@null</item>                                               //左
 </array>
超過4個時,排的型狀,就要在找一下了

這邊有些關於鎖屏的參考文章:
王宪明的android学习之旅 - android锁屏解析二
王宪明的android学习之旅 - android锁屏解析三
Balancor
APK反組譯取得packagename classname

沒有留言:

張貼留言