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

zhongyuanceshi 2012-11-14 09:00:17
RT,Android4.0.4如何实现:当有未接电话时,锁屏界面上的电话图标上显示一个小数字,表示有多少个电话未接?
...全文
971 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwj312 2013-05-15
  • 打赏
  • 举报
回复


该方式是不是必须得在真机上测试才可以的呀
spiralkiss 2013-01-03
  • 打赏
  • 举报
回复
在keyGurdUpdateMonitor.java中监听,通过MultiWaveView中回调设置图片就行了,然后在lockscreen.java中invalidate()
zhongyuanceshi 2012-11-28
  • 打赏
  • 举报
回复
引用 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了。请指教。
zhongyuanceshi 2012-11-25
  • 打赏
  • 举报
回复
贴出目前我的实现:

下面是我的处理,所有操作都在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、该在哪里怎样画上未接电话个数?
aaronman90 2012-11-23
  • 打赏
  • 举报
回复
不错写的很好
zhongyuanceshi 2012-11-23
  • 打赏
  • 举报
回复
引用 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()是怎样处理的?谢谢!
csdn_2013 2012-11-22
  • 打赏
  • 举报
回复
我只是提供了思路,贴出的只是部分代码而已,部分方法报错误,不代表不支持.... Utilities.getMissedCallCount(mContext);是自己封装的一个工具类
csdn_2013 2012-11-22
  • 打赏
  • 举报
回复
获取未接电话个数,是从数据库中获得的 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有帮助。
zhongyuanceshi 2012-11-22
  • 打赏
  • 举报
回复
引用 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
zhongyuanceshi 2012-11-21
  • 打赏
  • 举报
回复
非常感谢ConnectionUtils给的大的思路。但该如何布局电话个数控件(用TextView),又该在哪怎样显示呢?是不是在MultiWaveView这个View中借助canvas来画出来?
zhongyuanceshi 2012-11-21
  • 打赏
  • 举报
回复
感谢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。请问:该如何在拨号上加上数字。
HHLgolden110 2012-11-21
  • 打赏
  • 举报
回复
布局使用FrameLayout,将电话图标控件放下面,默认显示,未接个数控件放上面,默认隐藏; 逻辑采用ContentObserver监听电话数据库的变化,数据变化时查询数据库,得到未接电话个数
csdn_2013 2012-11-15
  • 打赏
  • 举报
回复
那就要看锁屏界面那块代码了,增加一个监听电话数据库的类 每隔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; } } };
eboy0120 2012-11-15
  • 打赏
  • 举报
回复
还真不知道,期待高人解答

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧