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

问题描述

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

目前,未接电话个数也要获取到。存在的问题就是如何在电话图标右上角显示未接电话个数?
电话图标是控件MultiWaveView上的图标,该类是系统已经定义好的。我想通过直接集成View来自定义自己的View,然后在OnDraw函数通过Canvas和paint,指定坐标来画。但始终是没有显示出来。自定义view的OnDraw函数也有跑到。请指教要实现这效果,该怎样是画未接个数呢?效果图:
我是在自定义的handler中调用构造函数。每10s就会handler处理。

private final Handler mUpdateMissCallNum = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG, "mUpdateMissCallNum");
switch (msg.what) {
case UPDATESTART:

Log.i(TAG, "UPDATESTART");
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;
mMissedCallView=new MissedCallView(mContext,sTempMissedCallCount);
Log.i(TAG, "sTempMissedCallCount is:"+sTempMissedCallCount);
        }
        }
    ).start();
    }
    break;
    default:
    break;
    }
}
}

mMissedCallView=new MissedCallView(mContext,sTempMissedCallCount);这就是我调用自定义view的地方。通过直接用坐标和canvas,paint画,不要再在xml文件里去写吧。
锁屏用到的xml文件:Keyguardscreentabunlock.xml (frameworkbasecoreresreslayout)该文件中用系统自定义的波纹锁屏

<com.android.internal.widget.multiwaveview.MultiWaveView
android:id="@+id/unlockwidget"
android:orientation="horizontal"
android:layoutwidth="matchparent"
android:layoutheight="matchparent"
android:layout_alignParentBottom="true"
        android:targetDrawables="@array/lockscreen_targets_with_camera"
        android:targetDescriptions="@array/lockscreen_target_descriptions_with_camera"
        android:directionDescriptions="@array/lockscreen_direction_descriptions"
        android:handleDrawable="@drawable/ic_lockscreen_handle"
        android:waveDrawable="@drawable/ic_lockscreen_outerring"
        android:outerRadius="@dimen/multiwaveview_target_placement_radius"
        android:snapMargin="@dimen/multiwaveview_snap_margin"
        android:hitRadius="@dimen/multiwaveview_hit_radius"
        android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
        android:horizontalOffset="0dip"
        android:verticalOffset="60dip"
        android:feedbackCount="3"
        android:vibrationDuration="20"
        />

效果图:
我们只是把相机改成了拨号,就是在这拨号图标上打算画上未接电话数。请指教,谢谢!
这个类存放位置:frameworkbasecorejavacomandroidinternalwidgetmultiwaveviewMissedCallView.java

public class MissedCallView extends View {

private static final String TAG = "MissedCallViews";

public static final int UPDATESTART = 10;

private static final int DELAYTIME = 10000;

private int sTempMissedCallCount=-1;

Context mContext;

Canvas mCanvas;

public MissedCallView(Context context)
{

super(context);

Log.i(TAG, "MissedCallView1");

mCanvas=new Canvas();

}

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

Log.i(TAG, "MissedCallView2");

mCanvas=new Canvas();

}

public MissedCallView(Context context,int missedCallNum) {

super(context);

sTempMissedCallCount=missedCallNum;

Log.i(TAG, "MissedCallView3");

mCanvas=new Canvas();

}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

if(sTempMissedCallCount>0)

{

Paint paint=new Paint(Paint.ANTIALIASFLAG);
paint.setColor(Color.RED); Log.i(TAG,"Integer.toString(sTempMissedCallCount)is:"+Integer.toString(sTempMissedCallCount)); canvas.drawText(Integer.toString(sTempMissedCallCount),40,310,paint);//50 invalidate();

Log.i(TAG, "invalidate");

}

}

}

这是自定义view。只跑了 这个构造函数MissedCallView(Context context,int missedCallNum)。是在我定义的public class MissCallObserver extends ContentObserver监听未接电话个数类中调用的。为什么没有跑onDraw函数?请指教。未接电话个数获取是正确的。关键是显示了。

解决方案

布局使用FrameLayout,将电话图标控件放下面,默认显示,未接个数控件放上面,默认隐藏;
逻辑采用ContentObserver监听电话数据库的变化,数据变化时查询数据库,得到未接电话个数

解决方案二:

可以用标记flagFLAG_SHOW_WHEN_LOCKED实现

public static final int FLAG_SHOW_WHEN_LOCKED

添加到API 5中

flag: 当屏幕被锁时显示指定标记,这会让应用窗口优先于其他窗口,可以用`FLAG_KEEP_SCREEN_ON`打开屏幕,在keyguard之前直接显示窗口,用`FLAG_DISMISS_KEYGUARD`自动解除keyguard。

在图片中显示2这个数量:

在系统设置中设置alarm字符串

String message = "2";
Settings.System.putString(context.getContentResolver(),
        Settings.System.NEXT_ALARM_FORMATTED, message);

补充:

需要查询未接电话的个数,然后在Cursor获取查询到的总数:

String[] projection = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
       String where = CallLog.Calls.TYPE+"="+CallLog.Calls.MISSED_TYPE;
       Cursor c = this.getContentResolver().query(CallLog.Calls.CONTENT_URI, selection,where, null, null);
       c.moveToFirst();
       Log.d("CALL", ""+c.getCount()); //其他操作
        if(c.getCount() == SOME_VALUE_TO_START_APP_ONE)

在where语句中,设置选择数据的条件,根据你的需求,应该是CallLog.Calls.MISSED_TYPE

还可以选择来电的名字,号码,家庭工作什么的。

表达式和SQL查询语句是等价的,比如:

SELECT CACHED_NAME, CACHED_NUMBER_LABEL, TYPE FROM CONTENT_URI WHERE TYPE=MISSED_TYPE

android锁屏的说明:http://code.google.com/p/mylockforandroid/wiki/LockActivity

解决方案三:

如果我理解不错的话,你是想自绘View
你把问题理清楚,就两点关健地方,
1:取得未接电话条数
2:将这个int型变量显示
问题(1)可参考下面代码:

private void findNewCallCount(){
        Cursor  csr = null;
        int missedCallCount = 0;
        try {
            csr = getContentResolver().query(Calls.CONTENT_URI, new String[]{Calls.NUMBER,Calls.TYPE,Calls.NEW},
                    null,null,Calls.DEFAULT_SORT_ORDER);
            if(null != csr){
                while(csr.moveToNext()){
                    int type = csr.getInt(csr.getColumnIndex(Calls.TYPE));
                    switch (type){
                        case Calls.MISSED_TYPE:
                            if(csr.getInt(csr.getColumnIndex(Calls.NEW)) == ){
                                missedCallCount++;
                            }
                            break;
                        case Calls.INCOMING_TYPE:
                            break;
                        case Calls.OUTGOING_TYPE:
                            break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            csr.close();
        }
        newCallCount = missedCallCount;//未读电话数目
    }

问题(2)关于canvas显示问题
这样就可以把字写上去了
//canvas.drawText("123条记录", x, y, mPaint);//xy坐标
你的view是怎么写的,可以log调试分析呀。
你想立既显示,却未公布你相关代码,我猜肯定是未刷新造成的
当有新的未接电话,立马刷新canvas,刷新方式多样
invalidate或者postinvalindate()都能调用onDraw函数还有矩形区域设置等地方需
注意,你可以搜"android canvas refresh"
你需要一个单独线程跟踪或是启动个service监听。

解决方案四:

MultiWaveView 接受的是Drawable, 所以最简单的方法是更改为新的BitmapDrawable,里面包含电话的icon和未接电话数,然后MultiWaveView.postInvalidate即可。

解决方案五:

有点意思 .......

解决方案六:

不知道 不知道怎么办

解决方案七:

在设置里面找一找,一般都在那里面的。

解决方案八:

先注释后改为Paint mPaint = new Paint(); franzhong

解决方案九:

private void findNewCallCount(){

Cursor csr = null;

int missedCallCount = 0;

try {

csr = getContentResolver().query(Calls.CONTENT_URI, new String[]{Calls.NUMBER,Calls.TYPE,Calls.NEW},

null,null,Calls.DEFAULT_SORT_ORDER);

if(null != csr){

while(csr.moveToNext()){

int type = csr.getInt(csr.getColumnIndex(Calls.TYPE));

switch (type){

case Calls.MISSED_TYPE:

if(csr.getInt(csr.getColumnIndex(Calls.NEW)) == ){

missedCallCount++;

}
break;

case Calls.INCOMING_TYPE:

break;

case Calls.OUTGOING_TYPE:

break;

}

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

csr.close();

}

newCallCount = missedCallCount;//未读电话数目

}

解决方案十:

使用FrameLayout,将电话图标控件放下面,默认为显示,未接个数控件放上面,默认是隐藏;
逻辑采用ContentObserver监听电话数据库的变化,数据变化时查询数据库,得到未接电话个数

时间: 2024-09-22 08:02:37

android40-如何在Android4.0.4锁屏界面的电话图标右上角显示未接电话个数?的相关文章

苹果发布iOS 8 锁屏界面可按设备位置显示APP图标

[摘要]比如用户在星巴克咖啡店时,在iOS8的锁屏界面上,将会显示星巴克的APP. 苹果发布iOS 8 锁屏界面可按设备位置显示APP图标BI中文站 6月4日报道iOS8的许多新功能,并未在苹果全球开发大会上被予以介绍.据报道,在iOS8操作系统的锁屏界面上,苹果将会根据用户所在的位置,显示一个最相关的应用软件图标.比如说,用户已经在星巴克咖啡店,此时,在iOS8的锁屏界面上,将会显示星巴克咖啡店的APP,这样方便用户查询商品信息或是结账支付.目前还不清楚苹果这一功能,是否会对显示的软件有一定的

android4.0 禁止横竖屏切换使用 android:configChanges=&amp;quot;orientation|keyboardHidden&amp;quot;无效

  android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效    在之前的版本中都是在Manifest文件中设置Activity的 android:configChanges="orientation|keyboardHidden" 但在android4.0中无效,最后发现是需要加其他一个属性:"screenSize" 改成这样就可以了 : android

与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复

原文:与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复 [源码下载] 与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复 作者:webabcd 介绍与众不同 windows phone 8.0 之 其它 锁屏信息和锁屏背景 电池状态 多分辨率应用 与 Windows Phone 商店相关的操作 系统的内置协议 快

windows8.1锁屏界面上自动播放幻灯片设置步骤

进行Windows 8.1桌面,把鼠标移动到右下角,出现右边工具,找到"设置",并单击它. 2 在"设置"里找到"更改电脑设置",并单击它,打开"电脑设置"页面. 3 在"电脑"设置页面里找到"锁屏界面",并点击它以选择. 4 在打开的"锁屏界面"的右边我们就可以进行各项参数的设置. 在锁屏界面上放映幻灯片:把它设置成开,这样锁屏了才能自动进行播放. 使用来自以下位置

Windows 10开机可以跳过锁屏界面的操作方法

正常情况下,我们启动Windows10系统时,首先会进入一个锁屏界面,接着点击按钮才会进入登录页面,有些用户认为锁屏界面多此一举,因此想要跳过锁屏界面,那么该如何操作呢? Windows10开机跳过锁屏界面的操作方法: 1.在小娜Cortana搜索框中输入命令"gpedit.msc",打开组策略编辑器; 2.在组策略编辑器中,依次找到"计算机配置"→"管理模板"→"控制面板"→"个性化"→"不显示

如何更改Windows 10锁屏界面超时时间

微软于 Windows 8 开始推出了新的锁屏特性,并于 Windows 10 周年更新中进行了重大更新.虽然我们已经可以于锁屏界面使用 Cortana.查看各种系统或应用的提示信息.以及动态切换锁屏界面背景等功能,但功能调节选项还是不够细化.例如,Windows 10 周年更新锁屏界面超时时间为 1 分钟,并没有直接提供修改切换时间的选项. 然而,如果你需要在锁屏界面中访问使用 Cortana 或在锁定屏幕上查看时间或其它通知消息,可以通过我们下面介绍的方法手动增加锁屏超时时间. 更改Wind

如何移除Windows 10锁屏界面「网络」按钮

Windows 10 的锁定屏幕是您登录到自己帐户前看到的第一屏,对于大多数用户来说它都非常实用. 通过个性化设置,用户不仅可以配置应用程序状态.自定义背景图像等多个选项,甚至还可以启用 Cortana 在 PC 锁屏时执行一些基本任务. 尽管 Windows 10 允许用户禁用锁定屏幕上的诸多功能,但操作系统还是缺少删除某些功能的选项,例如位于最右下角的「网络」按钮.通过点击该图标,任何人都可以直接断开当前 Windows 10 PC 的 Wi-Fi 无线网络连接.如果你在进行远程连接或下载东

android编程怎么在锁屏界面上显示文字

问题描述 android编程怎么在锁屏界面上显示文字 android编程中怎么在锁屏界面上显示文字,请大家帮我一下.

技术支持诈骗手段翻新:借勒索软件类锁屏界面恐吓用户

我们已经报道过多起"技术支持诈骗"的案例,通常情况下,别有用心的一方会随机地给人们打电话,假装其来自微软等大企业,进而以"用户的计算机上检测到了病毒"之类的借口一步步下套行骗.如果用户真相信他们可以帮忙搞定蓝屏死机什么的问题,那实在太天真了.因为真正等待着他们的,会是各种哄骗付费.但却根本无需购买的服务. 或许是老式的行骗手段已经收效甚微,"技术支持"诈骗者们也在不断地更新他们的手法.除了忽悠可以改善受害者的游戏体验之外,他们甚至学去了"