当前位置:编程学习 > wap >>

Android4.0.4锁屏界面的电话图标上如何显示未接电话个数?

RT,Android4.0.4如何实现:当有未接电话时,锁屏界面上的电话图标上显示一个小数字,表示有多少个电话未接? --------------------编程问答-------------------- 还真不知道,期待高人解答 --------------------编程问答-------------------- 那就要看锁屏界面那块代码了,增加一个监听电话数据库的类   每隔10秒发送一个空的消息....    再重新绘制锁屏界面的图片

     public void onChange(boolean selfChange) {
        //Delete the code, Ported to the message processing
        mUpdate.removeMessages(UPDATE_START);
        mUpdate.sendEmptyMessageDelayed(UPDATE_START, DELAY_TIME);
    }

    private final Handler mUpdate = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case UPDATE_START:
                sNewMissedCallCount = Utilities.getMissedCallCount(mContext);
                if (sNewMissedCallCount != sTempMissedCallCount) {
                    new Thread(new Runnable() {
                        public void run() {
                            sTempMissedCallCount = sNewMissedCallCount;
                            mContext.updateMissCall();                        }
                    }).start();
                }
                break;
            default:
                break;
            }
        }
    };

--------------------编程问答-------------------- 非常感谢ConnectionUtils给的大的思路。但该如何布局电话个数控件(用TextView),又该在哪怎样显示呢?是不是在MultiWaveView这个View中借助canvas来画出来? --------------------编程问答-------------------- 布局使用FrameLayout,将电话图标控件放下面,默认显示,未接个数控件放上面,默认隐藏;
逻辑采用ContentObserver监听电话数据库的变化,数据变化时查询数据库,得到未接电话个数 --------------------编程问答-------------------- 感谢HHLgolden110提供的另一种方法。但我们现在大的布局已经有了,如图:

就是要在拨号键盘上加上数字表示未接电话个数。这样出来简单点。该布局:

        <com.android.internal.widget.multiwaveview.MultiWaveView
            android:id="@+id/unlock_widget"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"

            android:targetDrawables="@array/lockscreen_targets_with_phone"
            android:targetDescriptions="@array/lockscreen_target_descriptions_with_phone"
            android:directionDescriptions="@array/lockscreen_direction_descriptions"
            android:handleDrawable="@drawable/ic_lockscreen_handle"
            android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
            android:outerRadius="@dimen/multiwaveview_target_placement_radius"
            android:snapMargin="@dimen/multiwaveview_snap_margin"
            android:hitRadius="@dimen/multiwaveview_hit_radius"
            android:horizontalOffset="0dip"
            android:verticalOffset="60dip"
            android:feedbackCount="3"
            android:vibrationDuration="20"
            />

这是系统自定义的View。请问:该如何在拨号上加上数字。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 2 楼 ConnectionUtils 的回复:
那就要看锁屏界面那块代码了,增加一个监听电话数据库的类   每隔10秒发送一个空的消息....    再重新绘制锁屏界面的图片

     public void onChange(boolean selfChange) {
        //Delete the code, Ported to the message processing
        mU……

sNewMissedCallCount = Utilities.getMissedCallCount(mContext);这个方法在4.0中没有,可能是版本不一样吧,
请问有没有其他方法直接获取未接电话个数?
我用一个BroadCastReceiver来获取未接电话个数,在MultiWaveView构造函数注册。如下:

    public MultiWaveView(Context context, AttributeSet attrs) {
        super(context, attrs);

Log.i(TAG, ">>MultiWaveView attrs");
        final IntentFilter filter = new IntentFilter();

        filter.addAction("com.android.phone.NotificationMgr.MissedCall_intent");

context.registerReceiver(new BroadcastReceiver()
{
            public void onReceive(Context context, Intent intent)
{
Log.i(TAG, "onReceive");
                final String action = intent.getAction();
if ("com.android.phone.NotificationMgr.MissedCall_intent".equals(action))
{
                   sNewMissedCallCount = intent.getExtras().getInt("MissedCallNumber"); 
   Log.i(TAG, "sNewMissedCallCount is:"+sNewMissedCallCount);
                   //mHandler.sendMessage(mUpdateMissCallNum.obtainMessage(MSG_LOCK_SCREEN_MISSED_CALL,mMissedCall, 0));
}
         }
}, filter);

不知道这样对不对?但来电话,MultiWaveView不会跑到,当然后面的onReceive、registerMissCallContentObservers也没有收到。但熄屏时(而不是我要的来电时)会跑MultiWaveView,onReceive还是不会收到、但registerMissCallContentObservers会跑到。
请高手指教:1、该如何获取未接电话个数?
2、来电话时屏幕点亮,在哪里注册未接电话数据库监听registerMissCallContentObservers --------------------编程问答-------------------- 获取未接电话个数,是从数据库中获得的
public static int getMissedCallCount(Context context) {
        // setup query spec, look for all Missed calls that are new.
        StringBuilder where = new StringBuilder("type = ");
        where.append(Calls.MISSED_TYPE);
        where.append(" AND new = 1");

        int nMissCall = 0;
        // start the query     
        Cursor cur = null;
        try {
            cur = context.getContentResolver().query(
                    Calls.CONTENT_URI,
                    new String[] {Calls._ID}, where.toString(), null, Calls.DEFAULT_SORT_ORDER);

            if (cur != null) {
                nMissCall = cur.getCount();
            }
        } catch (Exception ex) {
            Log.d(TAG, "getMissedCallCount: " + ex);
        }
        finally {
            if (cur != null) {
                cur.close();
            }
        }

        return nMissCall;
    }

监听数据库改变,不需要注册的  只需要在锁屏应用源码 增加一个类继承与android.database.ContentObserver类,其类的实现我先前回复的OnChange方法,其中OnChange方法的updateMissCall()这个就是重新绘制画面的。希望对LZ有帮助。 --------------------编程问答-------------------- 我只是提供了思路,贴出的只是部分代码而已,部分方法报错误,不代表不支持....  Utilities.getMissedCallCount(mContext);是自己封装的一个工具类 --------------------编程问答-------------------- 不错写的很好 --------------------编程问答--------------------
引用 8 楼 ConnectionUtils 的回复:
获取未接电话个数,是从数据库中获得的
public static int getMissedCallCount(Context context) {
        // setup query spec, look for all Missed calls that are new.
        StringBuilder where = new String……

监听数据库改变,不需要注册的 ---这个要注册吧,不注册根本没有执行OnChange方法(请问为什么不需注册?)。注册后该放在哪个函数调用呢?
updateMissCall()这个就是重新绘制画面的----这个函数是否重新画整个锁屏界面还是只画未接电话画面。现在我是在MultiWaveView.java的OnDraw方法调用 canvas.drawText(Integer.toString(sTempMissedCallCount),40,310,paint);来画的。直接在拨号图标右上角画字符串数字。请问ConnectionUtils,你的updateMissCall()是怎样处理的?谢谢! --------------------编程问答-------------------- 贴出目前我的实现:

下面是我的处理,所有操作都在MultiWaveView.java中
1、  
public MultiWaveView(Context context, AttributeSet attrs) {
        super(context, attrs);
..............
Log.i(TAG, ">>MultiWaveView attrs");
registerMissCallContentObservers();
.......................}

2、    private void registerMissCallContentObservers() {
Log.i(TAG, "registerMissCallContentObservers");
        ContentResolver resolver = mContext.getContentResolver();
        resolver.registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,true, mMissCallObserver);
    }
这个函数自己添加的。
3、每隔10s发一个空消息
    private final ContentObserver mMissCallObserver = new MissCallObserver();

    private class MissCallObserver extends ContentObserver {

public MissCallObserver() {
            super(new Handler());
        }

        @Override
        public void onChange(boolean selfChange) {
        
Log.i(TAG, "onChange");
//Delete the code, Ported to the message processing
mUpdateMissCallNum.removeMessages(UPDATE_START);
mUpdateMissCallNum.sendEmptyMessageDelayed(UPDATE_START, DELAY_TIME);
        }
    }
4、收到消息就查找数据库,获取未接电话个数
    private final Handler mUpdateMissCallNum = new Handler() {

        @Override
        public void handleMessage(Message msg) {
        
Log.i(TAG, "mUpdateMissCallNum");
            switch (msg.what) {
            case UPDATE_START:
Log.i(TAG, "UPDATE_START");
                sNewMissedCallCount = getMissedCallCount(mContext);
                if (sNewMissedCallCount != sTempMissedCallCount)
{
Log.i(TAG, "sNewMissedCallCount != sTempMissedCallCount");
                    new Thread(new Runnable()
{
                        public void run()
{
Log.i(TAG, "sNewMissedCallCount is:"+sNewMissedCallCount);
Log.i(TAG, "sTempMissedCallCount is:"+sTempMissedCallCount);
                            sTempMissedCallCount = sNewMissedCallCount;
Log.i(TAG, "sTempMissedCallCount is:"+sTempMissedCallCount);
//mStrMissCallNum=sTempMissedCallCount.toString();
                            //mTVInCallNum.setText(Integer.toString(sTempMissedCallCount));                        }
                    }
}
).start();
                }
                break;
            default:
                break;
            }
        }
    };
5、在MultiWaveView.java中的函数onDraw画上电话个数(即拨号图标右上角)
    @Override
    protected void onDraw(Canvas canvas) {
        mOuterRing.draw(canvas);
        for (TargetDrawable target : mTargetDrawables) {
            if (target != null) {
                target.draw(canvas);
            }
        }
        for (TargetDrawable target : mChevronDrawables) {
            if (target != null) {
                target.draw(canvas);
            }
        }
        mHandleDrawable.draw(canvas);

if(sTempMissedCallCount>0)
{
Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);

Log.i(TAG, "Integer.toString(sTempMissedCallCount) is:"+Integer.toString(sTempMissedCallCount));
canvas.drawText(Integer.toString(sTempMissedCallCount),40,310,paint);
}
    }

但这样来电话,不会马上更新电话个数图标。熄屏后再点亮就会显示。存在很多问题
1、如何在哪里来调用我的代码入口registerMissCallContentObservers();还是有其他办法
2、该在哪里怎样画上未接电话个数? --------------------编程问答--------------------
引用 9 楼 ConnectionUtils 的回复:
我只是提供了思路,贴出的只是部分代码而已,部分方法报错误,不代表不支持....  Utilities.getMissedCallCount(mContext);是自己封装的一个工具类

由于直接在MultiWaveView.java中处理存在很多问题;所有采用一个自定义View为MissedCallView(要在MultiWaveView控件的拨号图标右上角显示未接电话个数。),在OnDraw函数中利用canvas和paint来画,但是在lockscreen的构造函数中生成MissedCallView实例并通过registerMissCallContentObservers方法来监听未接电话个数从而开始跑自定义的MissedCallView.java文件。但这样导入开不了机,一直在开机画面。换了另一种方法,自定义view继承MultiWaveView,其他操作和自定义View一样,也是开不了机。看来用自定义view方法是行不通(不知道开机不了)。

请问ConnectionUtils:监听数据库改变,不需要注册的  只需要在锁屏应用源码 增加一个类继承与android.database.ContentObserver类----------你这个类有实现view的一些方法吗?你是怎样去更新画上未接电话个数呢?用什么控件的呢?如果这样可以直接监听到,而不需注册,就可以避免在lockscreen中去显示注册observer了。请指教。 --------------------编程问答-------------------- 在keyGurdUpdateMonitor.java中监听,通过MultiWaveView中回调设置图片就行了,然后在lockscreen.java中invalidate() --------------------编程问答--------------------

该方式是不是必须得在真机上测试才可以的呀
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,