2

我在 Android 应用程序中工作,我必须获取最后 20 个已拨电话。

这是我的活动:

public class Calls extends Activity {
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.calls);
    TextView dialledCall = (TextView)findViewById(R.id.dialledCall);
        Cursor managedCursor;
    try {

StringBuffer sb = new StringBuffer();
            String strOrder = CallLog.Calls.DATE + " DESC";
            managedCursor = managedQuery( CallLog.Calls.CONTENT_URI,null, CallLog.Calls.TYPE + " = " + CallLog.Calls.OUTGOING_TYPE,null, strOrder + " LIMIT 0, 6");
            managedCursor.moveToFirst();
            int number = managedCursor.getColumnIndex( CallLog.Calls.NUMBER );
            int type = managedCursor.getColumnIndex( CallLog.Calls.TYPE );
            int date = managedCursor.getColumnIndex( CallLog.Calls.DATE);
            int duration = managedCursor.getColumnIndex( CallLog.Calls.DURATION);
            sb.append( "Dialled Calls :");

            while ( managedCursor.moveToNext() ) {
            String phNumber = managedCursor.getString( number );
            String callType = managedCursor.getString( type );
            String callDate = managedCursor.getString( date );
            Date callDayTime = new Date(Long.valueOf(callDate));
            String callDuration = managedCursor.getString( duration );
            String dir = null;
            int dircode = Integer.parseInt( callType );

            switch( dircode ) {
            case CallLog.Calls.OUTGOING_TYPE:
            dir = "Dialled";
            break;
            }

            sb.append( "\nPhone Number : "+phNumber +" \nCall Type : "+dir+" \nCall Date : "+callDayTime+" \nCall duration in sec : "+callDuration );
            sb.append("\n----------------------------------");          
            }
            sb.append("\n==================================");
            sb.append("\n\n");
            managedCursor.close();
            Toast.makeText(this, "Eureka :)", Toast.LENGTH_SHORT).show();

            managedCursor = managedQuery( CallLog.Calls.CONTENT_URI,null, CallLog.Calls.TYPE + " = " + CallLog.Calls.INCOMING_TYPE,null, strOrder + " LIMIT 0, 6");
            managedCursor.moveToFirst();
            int number1 = managedCursor.getColumnIndex( CallLog.Calls.NUMBER );
            int type1 = managedCursor.getColumnIndex( CallLog.Calls.TYPE );
            int date1 = managedCursor.getColumnIndex( CallLog.Calls.DATE);
            int duration1 = managedCursor.getColumnIndex( CallLog.Calls.DURATION);
            sb.append( "Received Calls :");
            while ( managedCursor.moveToNext() ) {

            String phNumber1 = managedCursor.getString( number1 );
            String callType1 = managedCursor.getString( type1 );
            String callDate1 = managedCursor.getString( date1 );
            Date callDayTime1 = new Date(Long.valueOf(callDate1));
            String callDuration1 = managedCursor.getString( duration1 );
            String dir1 = null;
            int dircode = Integer.parseInt( callType1 );

            switch( dircode ) {
            case CallLog.Calls.INCOMING_TYPE:
            dir1 = "Received";
            break;
            }
            sb.append( "\nPhone Number : "+phNumber1 +" \nCall Type : "+dir1+" \nCall Date : "+callDayTime1+" \nCall duration in sec : "+callDuration1 );
            sb.append("\n----------------------------------");          
            }
            sb.append("\n==================================");
            sb.append("\n\n");
            managedCursor.close();
            Toast.makeText(this, "Eureka :) 1", Toast.LENGTH_SHORT).show();
        managedCursor.close();
}


 catch (NullPointerException e) {
                // TODO: handle exception
                Toast.makeText(this, "Sorry Man :(", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }
        }

这是相应的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:fillViewport="true" >

<Linearlayout android:layout_height="wrap_content"
 android:layout_width="fill_parent"
android:orientation="vertical">

        <TextView
            android:id="@+id/dialledCall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:textSize="13dp" />

</Linearlayout>
</ScrollView>

输出:我能够获得前 5 个拨打的号码,但在接听的电话中,我得到了messages.

我究竟做错了什么?

4

1 回答 1

1

很可能您缺少权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />

或者您的循环不正确,请尝试使用这种循环:

int count = 0;
if (cursor.moveToFirst()) {
  do {
    // Read your row here

    ++count;
  } while (cursor.moveToNext() && count<20);
}
cursor.close();

直接在查询中而不是在循环本身中限制行数也会更有效:

managedQuery( CallLog.Calls.CONTENT_URI, null, 
        CallLog.Calls.TYPE + " = " + CallLog.Calls.OUTGOING_TYPE, 
        null, strOrder + " LIMIT 0, 20");
于 2012-12-14T13:35:49.827 回答