为android添加耳机状态图标

原生态的android系统是没有耳机插入或未插入的状态指示的,本文就是讲解如何添加耳机插入的状态指示。效果图如下:

如图,当插入耳机后,在status bar上出现了一个耳机的图标。

这个耳机的图标和sim卡信号等图标在status bar的右边,因此这个实现肯定不是通过notification实现的,那么添加这个功能只能在framwork里面寻找了。具体的修改步骤如下:

1.在frameworks/base/core/res/res/drawable-mdpi目录先添加一个stat_sys_headset.png资源文件。这里面资源文件的目录要根据设备的分辨率来确定,我的设备是HVGA的,因此资源文件放在drawable-mdpi目录下。

2.修改frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java

public class StatusBarPolicy {
    private static final String TAG = "StatusBarPolicy" ;

    private static StatusBarPolicy sInstance;
    .....
    
    // alarm clock

    // Icon lit when clock is set

    private IBinder mAlarmClockIcon;
    private IconData mAlarmClockIconData;

    //modify here start
    //HeadSet

    private IBinder mHeadSetPlugIcon;
    private IconData mHeadSetPlugIconData;
    //modify here end


    .....

    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override

        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_TIME_TICK)) {
                updateClock();
            }
            .....
            else if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
                updateAlarm(intent);
            }
            //modify here start

            else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
                updateHeadset(intent);
            }
            //modify here end

            else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
                updateSyncState(intent);
            }
            ......
     };
     private StatusBarPolicy(Context context, StatusBarService service) {
        mContext = context;
        mService = service;
        mSignalStrength = new SignalStrength();
        if (FeatureOption.MTK_GEMINI_SUPPORT == true ) {
            mSignalStrengthGemini = new SignalStrength();
        }
        mBatteryStats = BatteryStatsService.getService();
        ....
        //modify here start

        //HeadSet

        mHeadSetPlugIconData = IconData.makeIcon(
            "headset" ,
            null ,com.android.internal.R.drawable.stat_sys_headset, 0 , 0 );
        mHeadSetPlugIcon = service.addIcon(mHeadSetPlugIconData, null );
        service.setIconVisibility(mHeadSetPlugIcon, false );
        //modify here end

        ....

        IntentFilter filter = new IntentFilter();

        // Register for Intent broadcasts for...
        filter.addAction(Intent.ACTION_TIME_TICK);
        ....
        //modify here start

        filter.addAction(Intent.ACTION_HEADSET_PLUG);
        //modify here end

        ....

    }

    //modify here start
    private final void updateHeadset(Intent intent) {

        Slog.d(TAG, "updateHeadset: state=" + intent.getIntExtra("state" , 0 ));
        mService.setIconVisibility(mHeadSetPlugIcon, (intent.getIntExtra("state" , 0 ) == 1 )?true :false );
    }
    //modify here end

    .....
}

3.修改frameworks/base/core/res/res/values/arrays.xml

<string-array name ="status_bar_icon_order">
        <item > <xliff :g id ="id"> clock</xliff :g> </item >

        <item > <xliff :g id ="id"> secure</xliff :g> </item >

        <item > <xliff :g id ="id"> alarm_clock</xliff :g> </item >

        <item > <xliff :g id ="id"> battery</xliff :g> </item >

        <item > <xliff :g id ="id"> phone_signal_2</xliff :g> </item >

        <item > <xliff :g id ="id"> phone_signal</xliff :g> </item >

        <item > <xliff :g id ="id"> phone_evdo_signal</xliff :g> </item >

        <item > <xliff :g id ="id"> data_connection</xliff :g> </item >

        <item > <xliff :g id ="id"> cdma_eri</xliff :g> </item >

        <item > <xliff :g id ="id"> tty</xliff :g> </item >

        <item > <xliff :g id ="id"> volume</xliff :g> </item >

        <item > <xliff :g id ="id"> mute</xliff :g> </item >

        <item > <xliff :g id ="id"> speakerphone</xliff :g> </item >

        <!-- modify here start. -->

        <item > <xliff :g id ="id"> headset</xliff :g> </item >

        <!-- modify here end -->

        <item > <xliff :g id ="id"> wifi</xliff :g> </item >

        <item > <xliff :g id ="id"> tty</xliff :g> </item >

        <item > <xliff :g id ="id"> bluetooth</xliff :g> </item >

        <item > <xliff :g id ="id"> gps</xliff :g> </item >

        <item > <xliff :g id ="id"> sync_active</xliff :g> </item >

        <item > <xliff :g id ="id"> sync_failing</xliff :g> </item >

        <item > <xliff :g id ="id"> ime</xliff :g> </item >

    </string-array >

其中 headset这个字符串就是 mHeadSetPlugIconData = IconData.makeIcon( "headset" , null 0 , 0 );”中的第一个参数。“<item > <xliff :g id ="id"> headset</xliff :g> </item > ”这个语句的位置于图标在status bar上显示的位置有关。


按照这3个步骤修改后重新编译源码之后,就可以看到如上图的效果了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值