如何在锁屏界面显示未接来电数量?

8
我制作了一个应用程序,可以在屏幕锁定时显示未接来电,但我不知道如何在锁定屏幕上显示未接来电的数量。调用图像来自已经定义的MultiWaveView,我已经尝试使用OnDrawCanvaspaint,绘制指定坐标,但是它没有起作用。所以有人可以帮助我吗?非常感谢。
如何在图片中显示数字(例如图片中的位置2)?
编辑1:
现在我已经在应用程序中获取到正确的未接来电数量,但是它没有正常显示。
类: framework\base\core\java\com\android\internal\widget\multiwaveview\MissedCallView.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");

}

}

这是一个自定义视图,只有 MissedCallView(Context context,int missedCallNum) 起作用,在 public class MissCallObserver extends ContentObserver 监听未接来电号码时调用。但是 onDraw 不起作用,因此应用程序无法显示我收到的号码。

编辑2:

现在我在我的自定义 handler 中每 10 秒钟调用这个函数。

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);
//call my costum view here
Log.i(TAG, "sTempMissedCallCount is:"+sTempMissedCallCount);
        }
        }
    ).start();
    }
    break;
    default:
    break;
    }
}
}

我使用canvas和paint进行绘制,没有使用XML文件。

然后在XML中锁定屏幕:Keyguardscreentabunlock.xml(framework\base\core\res\res\layout)。

这在系统中使用了Ripple Lock。

<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"
        />

然后我得到了这个: enter image description here 现在我想在圆心(图片中鼠标位置)显示未接来电号码,但我不知道该如何实现。
1个回答

5

您可以使用标志 FLAG_SHOW_WHEN_LOCKED

有关锁屏的更多信息,请参见 我的Android锁定屏幕

public static final int FLAG_SHOW_WHEN_LOCKED

API级别5的代码行

窗口标志:特殊标志,允许在屏幕锁定时显示窗口。这将使应用程序窗口优先于键保护或任何其他锁定屏幕。可以与FLAG_KEEP_SCREEN_ON一起使用,以在显示关键保护窗口之前直接打开屏幕并显示窗口。可以与FLAG_DISMISS_KEYGUARD一起使用,以自动完全解除非安全键保护

未接来电的UPDATE1:

您只需要查询电话是否有任何通话,然后提取未接来电,然后只需获取由查询返回的游标中的行数即可。

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()); //do some other operation
        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

UPDATE2: 如何在图片中显示数字“2”?
你只需要在系统设置中设定闹钟字符串即可,具体操作如下:
String message = "2";
Settings.System.putString(context.getContentResolver(),
        Settings.System.NEXT_ALARM_FORMATTED, message);

感谢您的回复,但是我不清楚如何使用标志?我的错误,我没有清楚地描述问题,我想知道如何计算未接来电的数量,然后在图片中显示该数字的位置。您能否请教我更多呢?谢谢。 - Amour Ring
1
@ 这很有效,你真是太好了。我已经得到了未接来电的数量,但我不知道如何在这里使用 flag:FLAG_SHOW_WHEN_LOCKED,我想请问一下使用步骤,如果您愿意的话。 - Amour Ring
@AmourRing:回答中给出的链接 - Ravindra Bagale
谢谢你的耐心回答,但我已经查看了链接,仍然不知道如何在我的应用程序中使用Flag? >>>_<<< - Amour Ring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接