如何在Android SDK 2.2上检索错过的电话?

7

在我的应用中,当用户未接来电时,我需要执行某些操作。

我已经在android.telephonyNotificationManager中搜索过,但没有找到解决这个问题的方法。

有人知道如何判断手机上是否有未接来电吗?

3个回答

14

这里是可以查询未接来电通话记录的代码。基本上,您将不得不以某种方式触发它,并确保给通话记录一些时间(几秒钟足够了)来写入信息,否则如果您过早地检查通话记录,则找不到最近的通话。

final String[] projection = null;
final String selection = null;
final String[] selectionArgs = null;
final String sortOrder = android.provider.CallLog.Calls.DATE + " DESC";
Cursor cursor = null;
try{
    cursor = context.getContentResolver().query(
            Uri.parse("content://call_log/calls"),
            projection,
            selection,
            selectionArgs,
            sortOrder);
    while (cursor.moveToNext()) { 
        String callLogID = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls._ID));
        String callNumber = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.NUMBER));
        String callDate = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.DATE));
        String callType = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.TYPE));
        String isCallNew = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.NEW));
        if(Integer.parseInt(callType) == MISSED_CALL_TYPE && Integer.parseInt(isCallNew) > 0){
            if (_debug) Log.v("Missed Call Found: " + callNumber);
        }
    }
}catch(Exception ex){
    if (_debug) Log.e("ERROR: " + ex.toString());
}finally{
    cursor.close();
}

我希望你会觉得这有用。


MISSED_CALL_TYPE 是如何声明的? - erdomester
3
MISSED_CALL_TYPE = android.provider.CallLog.Calls.MISSED_TYPE;
  • 抱歉之前没有提到这一部分。
(翻译说明:将英语代码翻译成中文,并在结尾处添加抱歉信息)
- Camille Sévigny
谢谢!当时我无法使用它,所以我发现这些调用类型有两种方式:1.将其声明为整数:int typeColumn = c.getColumnIndex(android.provider.CallLog.Calls.TYPE);,然后int callType = c.getInt(typeColumn);最后例如if calltype==1 then.....2:使用int outgoingtypeColumn = c.getColumnIndex(android.provider.CallLog.Calls.TYPE + "='2'");等等。希望这能帮助其他人! - erdomester
3
谢谢,Camille。这段代码很有用。对于计划使用它的其他人:不要忘记在 AndroidManifest.xml 中添加 android.permission.READ_CONTACTS 权限,并在关闭游标之前检查它是否为 null。 - Dan J
@BArtWell - 上述代码肯定不会返回短信消息。 - Camille Sévigny
显示剩余2条评论

0

是的。但在这种情况下,我将无法知道未接来电是否已被接听。在我的应用程序中,如果未接来电已被接听,我不应再次通知用户有未接来电。 - Mathieu
1
一个未接来电怎么接听?CallLog.Calls类中有一个MISSING_TYPE常量,我相信一个电话要么是MISSING_TYPE、INCOMING_TYPE或者OUTGOING_TYPE。 - GôTô
是的。很抱歉我没有清楚地表达我的意思。我同意你的观点,当手机“响铃”时,“未接来电”无法被回答。但是,当我们知道有一个未接来电时,我们可以回拨电话,这就是我在问题中所说的“回答”的意思。因此,在这种情况下,我认为使用通知比阅读通话记录中的信息更好。希望这次我表达得更清楚了。 - Mathieu

0

我想你应该有内容提供者来访问通话记录。

http://www.anddev.org/video-tut_-_querying_and_displaying_the_calllog-t169.html

http://www.devx.com/wireless/Article/41133

如果这段代码能够正常工作,你只需要在正确的时间运行这个查询。我的意思是检查一些样本,当你的设备接到电话时可以通知你。

http://groups.google.com/group/android-developers/browse_thread/thread/d97a759a3708cbe3

一旦您收到此通知,请设置一个计时器或使用一些内置的意图来查找手机是否恢复正常状态并访问通话记录...

可能是重复的问题

在Android中接收未接电话的广播接收器

在Android应用程序中显示未接来电提示


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