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。请问:该如何在拨号上加上数字。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
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);是自己封装的一个工具类 --------------------编程问答-------------------- 不错写的很好 --------------------编程问答--------------------
监听数据库改变,不需要注册的 ---这个要注册吧,不注册根本没有执行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、该在哪里怎样画上未接电话个数? --------------------编程问答--------------------
由于直接在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