我已经制作了一个可以在屏幕锁定时显示未接来电的应用,但我不知道如何在锁定的屏幕上显示未接来电的数量。来电图像来自已定义的MultiWaveView
,我使用OnDraw
和Canvas
以及paint
使用,绘制指定坐标。但它不起作用。所以有人帮助我吗?非常感谢。
如何在图片中显示数字(例如图片位置 2 )?
EDIT1
现在我已经在应用中获得了正确的未接来电号码,但它没有正确显示
类:
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不起作用,因此应用程序不会显示数字I有。
EDIT2:
现在我在我的自定义hanlder中调用该函数,处理程序每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;
}
}
}
我用画布和绘画绘制它,没有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"
/>
然后我明白了:
现在我想在圈子的中心显示未接来电号码(在图片鼠标位置。),我不知道如何实现。
答案 0 :(得分:5)
您可以使用标记FLAG_SHOW_WHEN_LOCKED
有关锁屏My android lock
的更多信息public static final int FLAG_SHOW_WHEN_LOCKED
API级别5的行
未接来电的窗口标志:在屏幕显示时显示窗口的特殊标志 锁定。这将使应用程序窗口优先于密钥 警卫或任何其他锁屏。可以与FLAG_KEEP_SCREEN_ON一起使用 在显示按键之前打开屏幕并直接显示窗口 守卫窗口。可以与FLAG_DISMISS_KEYGUARD一起自动使用 完全取消非安全密钥保护
您只需要在手机上查询任何电话,然后提取错过的电话。然后只获取查询返回的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()); //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:如何在picutre中显示2。
您需要做的就是在系统设置中设置警报字符串,如下所示:
String message = "2";
Settings.System.putString(context.getContentResolver(),
Settings.System.NEXT_ALARM_FORMATTED, message);