Android风格通话记录
问题描述:
我必须创建一个类似于android通话记录的活动。我还没有找到关于它的很多信息。我发现了什么是本实施例中,具有一个主活动,其中有3个按钮:Android风格通话记录
1-呼出列表 2-内迁呼叫列表 3-未接电话列表中
而且每个按钮发送到另一个活动这是一个列表视图,每个调用的细节。
但我需要的,是首先要统一所有这个应用程序到一个唯一的布局,至极显示所有错过,outoging和迁入同时通话,按日期上市。我现在认为这应该很简单,但我无法做到这一点,这是因为我向你求助。在此之后,我应该做的下一件事是修改listview布局,以显示android显示的通话记录,通过手机图标和如果您触摸该名称可以调用该人的选项。
但首先,我需要应用程序以我需要的方式运行。
这是主要布局的代码,其中有3个按钮:
public class CallLogsDemoActivity extends Activity {
public static ArrayList<CallLogModel> outgoingList;
public static ArrayList<CallLogModel> incomingList;
public static ArrayList<CallLogModel> missedcallList;
public static final int OUTGOING_CALLS = 1;
public static final int INCOMING_CALLS = 2;
public static final int MISSED_CALLS = 3;
public static final String CALL_TYPE = "TYPE";
private Button inBtn, outBtn, missedBtn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
outBtn = (Button) findViewById(R.id.button1);
inBtn = (Button) findViewById(R.id.button2);
missedBtn = (Button) findViewById(R.id.button3);
inBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showIncomingList();
}
});
outBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showOutGoingList();
}
});
missedBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showMissedList();
}
});
outgoingList = new ArrayList<CallLogModel>();
incomingList = new ArrayList<CallLogModel>();
missedcallList = new ArrayList<CallLogModel>();
new ReadLogs().execute();
}
private void showIncomingList() {
Intent intent = new Intent(this, CallLogs.class);
intent.putExtra(CALL_TYPE, INCOMING_CALLS);
startActivity(intent);
}
private void showMissedList() {
Intent intent = new Intent(this, CallLogs.class);
intent.putExtra(CALL_TYPE, MISSED_CALLS);
startActivity(intent);
}
private void showOutGoingList() {
Intent intent = new Intent(this, CallLogs.class);
intent.putExtra(CALL_TYPE, OUTGOING_CALLS);
startActivity(intent);
}
private String getDuration(long milliseconds) {
int seconds = (int) (milliseconds/1000) % 60;
int minutes = (int) ((milliseconds/(1000 * 60)) % 60);
int hours = (int) ((milliseconds/(1000 * 60 * 60)) % 24);
if (hours < 1)
return minutes + ":" + seconds;
return hours + ":" + minutes + ":" + seconds;
}
private String getDateTime(long milliseconds) {
Date date = new Date(milliseconds);
//return DateFormat.getDateTimeInstance().format(new Date());
return date.toLocaleString();
}
private void readCallLogs() {
missedcallList.clear();
incomingList.clear();
outgoingList.clear();
Cursor callLogCursor = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
android.provider.CallLog.Calls.DEFAULT_SORT_ORDER);
if (callLogCursor != null) {
while (callLogCursor.moveToNext()) {
String id = callLogCursor.getString(callLogCursor
.getColumnIndex(CallLog.Calls._ID));
String name = callLogCursor.getString(callLogCursor
.getColumnIndex(CallLog.Calls.CACHED_NAME));
String cacheNumber = callLogCursor.getString(callLogCursor
.getColumnIndex(CallLog.Calls.CACHED_NUMBER_LABEL));
String number = callLogCursor.getString(callLogCursor
.getColumnIndex(CallLog.Calls.NUMBER));
long dateTimeMillis = callLogCursor.getLong(callLogCursor
.getColumnIndex(CallLog.Calls.DATE));
long durationMillis = callLogCursor.getLong(callLogCursor
.getColumnIndex(CallLog.Calls.DURATION));
int callType = callLogCursor.getInt(callLogCursor
.getColumnIndex(CallLog.Calls.TYPE));
String duration = getDuration(durationMillis * 1000);
String dateString = getDateTime(dateTimeMillis);
if (cacheNumber == null)
cacheNumber = number;
if (name == null)
name = "No Name";
CallLogModel callLogModel = new CallLogModel(name, cacheNumber,
duration, dateString);
if (callType == CallLog.Calls.OUTGOING_TYPE) {
outgoingList.add(callLogModel);
} else if (callType == CallLog.Calls.INCOMING_TYPE) {
incomingList.add(callLogModel);
} else if (callType == CallLog.Calls.MISSED_TYPE) {
missedcallList.add(callLogModel);
}
}
callLogCursor.close();
}
}
private class ReadLogs extends AsyncTask<Void, Void, Void> {
/* Object */
ProgressDialog dialog;
/*
* Function name: onPreExecute Parameters: Void params Return: void
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
dialog = ProgressDialog.show(CallLogsDemoActivity.this,
"Reading Call Logs...", "Please wait...", true);
}
/*
* Function name: doInBackground Parameters: Void params Return: void
*/
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
readCallLogs();
return null;
}
/*
* Function name: onPostExecute Parameters: Void result Return: void
*/
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
dialog.dismiss();
}
}
}
而这是其他活动至极显示列表:
public class CallLogs extends Activity {
private ListView mainListView;
private ArrayAdapter<CallLogModel> listAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
mainListView = (ListView) findViewById(R.id.listView);
mainListView.setSmoothScrollbarEnabled(true);
Bundle extras = getIntent().getExtras();
int callType = extras.getInt(CallLogsDemoActivity.CALL_TYPE);
if (callType == CallLogsDemoActivity.OUTGOING_CALLS)
listAdapter = new CallLogsArrayAdapter(this,
CallLogsDemoActivity.outgoingList);
else if (callType == CallLogsDemoActivity.INCOMING_CALLS)
listAdapter = new CallLogsArrayAdapter(this,
CallLogsDemoActivity.incomingList);
else if (callType == CallLogsDemoActivity.MISSED_CALLS)
listAdapter = new CallLogsArrayAdapter(this,
CallLogsDemoActivity.missedcallList);
mainListView.setAdapter(listAdapter);
}
public void initElements() {
listAdapter.notifyDataSetChanged();
}
}
如上所述,我尝试将此代码统一为只显示一个布局并显示所有呼叫ti同时,android也会这么做,但是没有达到它。
答
改变此密码
int callType = extras.getInt(CallLogsDemoActivity.CALL_TYPE);
if (callType == CallLogsDemoActivity.OUTGOING_CALLS)
listAdapter = new CallLogsArrayAdapter(this,
CallLogsDemoActivity.outgoingList);
else if (callType == CallLogsDemoActivity.INCOMING_CALLS)
listAdapter = new CallLogsArrayAdapter(this,
CallLogsDemoActivity.incomingList);
else if (callType == CallLogsDemoActivity.MISSED_CALLS)
listAdapter = new CallLogsArrayAdapter(this,
CallLogsDemoActivity.missedcallList);
mainListView.setAdapter(listAdapter);
对此
int callType = extras.getInt(CallLogsDemoActivity.CALL_TYPE);
ArrayList<CallLogModel> collectiveList = new ArrayList<CallLogModel>();
collectiveList.addAll(CallLogsDemoActivity.outgoingList);
collectiveList.addAll(CallLogsDemoActivity.incomingList);
collectiveList.addAll(CallLogsDemoActivity.missedcallList);
listAdapter = new CallLogsArrayAdapter(this,collectiveList);
mainListView.setAdapter(listAdapter);
你面对的是什么问题。是不是显示列表或您面临任何崩溃? –
好的,现在我明白了,您希望所有的呼叫类型都显示在一个列表中。没有按任何类型过滤。对? –
@Changdeo Jadhav当试图统一所有,我不会崩溃的应用程序,但列表不显示任何内容。我想是在一个列表,在列表中没有通过过滤来显示所有的呼叫类型...但我想十个分量每个呼叫类型,然后以一个图标取决于它是否是一个missedcall,outoging来电或迁入添加到每个呼叫请致电 – masmic