开源APP发布——VCMsg

应用图标:

应用界面:
通话记录:

拨号器:

、联系人:

联系人列表:

软件说明:
VCMsg——二次元个性通讯录!
引用@wuyudong 的API
作者:wuyudong
出处:http://www.cnblogs.com/wuyudong/
CopyRight@Swiss126
软件下载地址:
慕晓资源站:http://www.swiss126.icoc.cc/pd.jsp?id=31&_pp=105_412
百度云:http://pan.baidu.com/s/1bprcGk3
代码及其素材:
ResentCall.java
package com.swiss126.vcmsg;
import android.Manifest;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.provider.CallLog;
import android.support.v4.app.ActivityCompat;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import com.anye.greendao.gen.DaoSession;
import com.anye.greendao.gen.UsersDao;
/**
* A simple {@link Fragment} subclass.
*/
public class ResentCall extends Fragment {
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private List<Map<String, Object>> data,tempList;
private ListView listItem;
private Users choosed;
public ResentCall() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_phone_book, container, false);
listItem = (ListView) view.findViewById(R.id.list);
data = getData();
SimpleAdapter adapter = new SimpleAdapter(getActivity(), data, R.layout.item,
new String[] { "image", "name", "publish", "tel" },
new int[] { R.id.image, R.id.name, R.id.publish, R.id.tel });
//image头像,name名字,tel号码,publish最近呼叫时间
listItem.setAdapter(adapter);
listItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,
long id) {
Map<String, Object> item = (Map<String, Object>) data.get(position);
if (!tempList.isEmpty()) {
choosed = new Users((long) 0, item.get("name").toString(), item.get("tel").toString(), "", "");
//给ListView注册上下文菜单
registerForContextMenu(listItem);//View类型
}
}
});
return view;
}
private List<Map<String, Object>> getData() {
data = new ArrayList<Map<String, Object>>();
tempList =getResentCall();
if (tempList.isEmpty()) {
Map<String, Object> item = new HashMap<String, Object>();
item.put("image", R.drawable.ico);
item.put("name", "温馨提示:");
item.put("publish", "");
item.put("tel", "最近通话记录为空!");
data.add(item);
}
else data=tempList;
/*得到一系列数据~
Map<String, Object> item = new HashMap<String, Object>();
item.put("image", R.drawable.ico);
item.put("name", "洛天依");
item.put("publish", "");
item.put("tel", "13066112255");
data.add(item);
*/
return data;
}
private List<Map<String, Object>> getResentCall() {
// 1.获得ContentResolver
ContentResolver resolver = getActivity().getContentResolver();
// 2.利用ContentResolver的query方法查询通话记录数据库
/* * @param uri 需要查询的URI,(这个URI是ContentProvider提供的)
* * @param projection 需要查询的字段
* * @param selection sql语句where之后的语句
* * @param selectionArgs ?占位符代表的数据
* * @param sortOrder 排序方式
* */
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
return null;
}
Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI,// 查询通话记录的URI
new String[]{CallLog.Calls.CACHED_NAME// 通话记录的联系人
, CallLog.Calls.NUMBER// 通话记录的电话号码
, CallLog.Calls.DATE// 通话记录的日期
, CallLog.Calls.DURATION// 通话时长
, CallLog.Calls.TYPE}// 通话类型
, null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示
);
// 3.通过Cursor获得数据
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE));
String date = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date(dateLong));
int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));
int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));
String typeString = "";
switch (type) {
case CallLog.Calls.INCOMING_TYPE:
typeString = "打入";
break;
case CallLog.Calls.OUTGOING_TYPE:
typeString = "打出";
break;
case CallLog.Calls.MISSED_TYPE:
typeString = "未接";
break;
default:
break;
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", R.drawable.ico);
map.put("name", (name == null) ? "未备注联系人" : name);
map.put("publish", date+typeString);
map.put("tel", number);
list.add(map);
}
return list;
}
private void UpdateView(){//刷新数据
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new ResentCall());
fragmentTransaction.commit();
}
private void ToInfo(String name, String tel){//跳转自信息修改、查看页面
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new Info(name,tel));
fragmentTransaction.commit();
}
//菜单!
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
// 加载xml中的上下文菜单
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.menu_resentcall, menu);
}
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_add://转到Info界面添加联系人
ToInfo(choosed.getName(), choosed.getTelnum());
break;
case R.id.menu_call://系统拨号
//用intent启动拨打电话
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+choosed.getTelnum()));
startActivity(intent);
break;
}
return super.onContextItemSelected(item);
}
}
ITelephony.java
package com.android.internal.telephony;
public interface ITelephony{
boolean endCall();
void answerRingingCall();
}
Users.java
package com.swiss126.vcmsg;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.NotNull;
import org.greenrobot.greendao.annotation.Generated;
@Entity
public class Users {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
private String telnum,email,qq;
@Generated(hash = 1619983801)
public Users(Long id, @NotNull String name, String telnum, String email, String qq) {
this.id = id;
this.name = name;
this.telnum = telnum;
this.email = email;
this.qq = qq;
}
@Generated(hash = 2146996206)
public Users() {
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getTelnum() {
return this.telnum;
}
public void setTelnum(String telnum) {
this.telnum = telnum;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQQ() {
return this.qq;
}
public void setQQ(String qq) {
this.qq = qq;
}
public String getQq() {
return this.qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public Long getId() {
return this.id;
}
}
App.java
package com.swiss126.vcmsg;
import android.app.Application;
import android.content.Context;
import com.anye.greendao.gen.DaoMaster;
import com.anye.greendao.gen.DaoSession;
import org.greenrobot.greendao.database.Database;
public class App extends Application {
private static DaoMaster daoMaster;
private static DaoSession daoSession;
/**
* 获取DaoMaster
*
* @param context
* @return
*/
public static DaoMaster getDaoMaster(Context context) {
if (daoMaster == null) {
try{
DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context,"test.db",null);
daoMaster = new DaoMaster(helper.getWritableDatabase()); //获取未加密的数据库
}catch (Exception e){
e.printStackTrace();
}
}
return daoMaster;
}
/**
* 获取DaoSession对象
*
* @param context
* @return
*/
public static DaoSession getDaoSession(Context context) {
if (daoSession == null) {
if (daoMaster == null) {
getDaoMaster(context);
}
daoSession = daoMaster.newSession();
}
return daoSession;
}
}
MainActivity.java
package com.swiss126.vcmsg;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ImageButton;
import android.widget.Toast;
import java.lang.reflect.Field;
/*
* Main 主界面
* PhoneBook 通讯录(兼最近通话列表)
* Info 详细信息(兼信息编辑)
* Dial 拨号器
* 呼叫界面系统自带
*/
public class MainActivity extends Activity {
private ImageButton btn1, btn2, btn3;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private AlertDialog.Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new Dial());
fragmentTransaction.commit();
btn1 = (ImageButton) findViewById(R.id.imageButton);
btn1.setImageResource(R.drawable.people);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new PhoneBook());
fragmentTransaction.commit();
}
});
btn2 = (ImageButton) findViewById(R.id.imageButton2);
btn2.setImageResource(android.R.drawable.ic_dialog_dialer);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new Dial());
fragmentTransaction.commit();
}
});
btn3 = (ImageButton) findViewById(R.id.imageButton3);
btn3.setImageResource(R.drawable.msg);
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new ResentCall());
fragmentTransaction.commit();
}
});
}
//菜单!
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_actionbar, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_about:
builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage(getResources().getString(R.string.app_name) + "——二次元个性通讯录!" +
"\n引用@wuyudong的API" +
"\nCopyRight@Swiss126");
builder.setTitle("关于软件");
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
break;
case R.id.menu_close:
//Toast.makeText(MainActivity.this, "关闭软件", Toast.LENGTH_LONG).show();
builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("确认退出" + getResources().getString(R.string.app_name) + "?");
builder.setTitle("温馨提示");
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
MainActivity.this.finish();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
break;
}
return super.onContextItemSelected(item);
}
}
Dial.java
package com.swiss126.vcmsg;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
/**
* A simple {@link Fragment} subclass.
*/
public class Dial extends Fragment {
private Button btn[];
private ImageButton dia;
private TextView telnum;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
public Dial() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_dial, container, false);
//Toast.makeText(getActivity(), "拨号器", Toast.LENGTH_SHORT).show();
dia= (ImageButton) view.findViewById(R.id.ok);
dia.setImageResource(android.R.drawable.sym_action_call);
dia.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//打电话~
String number = telnum.getText()+"";
if(number.isEmpty())
{
Toast.makeText(getActivity(), "请重新输入电话号码!", Toast.LENGTH_SHORT).show();
}
else {
//用intent启动拨打电话
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+number));
startActivity(intent);
}
}
});
Resources res = getResources();
btn = new Button[14];
telnum = (TextView) view.findViewById(R.id.telnum);
telnum.setText("");
for(int i=0;i<14;i++)
{
if(i<10)
{
int id = res.getIdentifier("_" + i, "id", getActivity().getPackageName());
final int x=i;
btn[i] = (Button) view.findViewById(id);
btn[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
telnum.setText(telnum.getText()+""+x);
}
});
}
else if (i==10){
btn[i]= (Button) view.findViewById(R.id._p);
btn[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
telnum.setText(telnum.getText()+"#");
}
});
}
else if (i==11){
btn[i]= (Button) view.findViewById(R.id._x);
btn[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
telnum.setText(telnum.getText()+"*");
}
});
}
else if (i==12){
btn[i]= (Button) view.findViewById(R.id.cl);
btn[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
telnum.setText("");
}
});
}
else if (i==13){
btn[i]= (Button) view.findViewById(R.id.br);
btn[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(telnum.getText().length()>0)
telnum.setText(telnum.getText().subSequence(0,telnum.getText().length()-1));
}
});
}
}
return view;
}
}
PhoneBook.java
package com.swiss126.vcmsg;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.anye.greendao.gen.DaoSession;
import com.anye.greendao.gen.UsersDao;
import com.wuyudong.getcontacts.domain.ContactInfo;
import com.wuyudong.getcontacts.service.ContactInfoParser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A simple {@link Fragment} subclass.
*/
public class PhoneBook extends Fragment {
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private List<Map<String, ?>> data;
private UsersDao usersDao;
private ListView listItem;
private List<Users> usersList;
private Users choosed;
public PhoneBook() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// get the note DAO
DaoSession daoSession = ((App) getActivity().getApplication()).getDaoSession(getActivity().getApplicationContext());
usersDao = daoSession.getUsersDao();
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_phone_book, container, false);
listItem = (ListView) view.findViewById(R.id.list);
data = getData();
SimpleAdapter adapter = new SimpleAdapter(getActivity(), data, R.layout.item,
new String[] { "image", "name", "publish", "tel" },
new int[] { R.id.image, R.id.name, R.id.publish, R.id.tel });
//image头像,name名字,tel号码,publish最近呼叫时间
listItem.setAdapter(adapter);
listItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,
long id) {
Map<String, Object> item=(Map<String, Object>) data.get(position);
if(!usersList.isEmpty())
{
choosed=usersList.get(position);
}
//给ListView注册上下文菜单
registerForContextMenu(listItem);//View类型
//弹出选项菜单(导入,添加,删除,查看,修改,呼叫)
//Toast.makeText(getActivity().getApplicationContext(), item.get("name")+"电话号码是:"+item.get("tel")+"position:"+position, Toast.LENGTH_LONG).show();
}
});
return view;
}
private void getSystemInfo() {
List<ContactInfo> infos = ContactInfoParser.findAll(getActivity().getApplicationContext());
for (ContactInfo info : infos) {
Users temp=new Users();
temp.setName(info.getName());
temp.setTelnum(info.getPhone());
temp.setEmail(info.getEmail());
temp.setQQ(info.getQq());
try {
usersDao.insert(temp);
}catch (Exception e)
{
continue;
}
}
UpdateView();
}
private List<Map<String, ?>> getData() {
List<Map<String, ?>> data = new ArrayList<Map<String, ?>>();
usersList=usersDao.loadAll();
if(usersDao.loadAll().isEmpty())
{
Map<String, Object> item = new HashMap<String, Object>();
item.put("image",R.drawable.ico);
item.put("name", "温馨提示:");
item.put("publish", "");
item.put("tel", "没有联系人,请添加联系人!");
data.add(item);
}
else {
for ( int i=0;i<usersList.size();i++) {
Map<String, Object> item = new HashMap<String, Object>();
item.put("image", R.drawable.ico);
item.put("name", usersList.get(i).getName());
item.put("publish", "");
item.put("tel", usersList.get(i).getTelnum());
data.add(item);
}
}
/*得到一系列数据~
Map<String, Object> item = new HashMap<String, Object>();
item.put("image", R.drawable.ico);
item.put("name", "洛天依");
item.put("publish", "");
item.put("tel", "13066112255");
data.add(item);
*/
return data;
}
private void UpdateView(){
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new PhoneBook());
fragmentTransaction.commit();
}
private void ToInfo(Users choosed, boolean b){//跳转自信息修改、查看页面
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new Info(choosed,b));
fragmentTransaction.commit();
}
private void ToInfo(){//跳转自添加页面
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.loader, new Info());
fragmentTransaction.commit();
}
//菜单!
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
// 加载xml中的上下文菜单
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater();
if(usersList.isEmpty()) {
inflater.inflate(R.menu.menu_empty, menu);
}else {
inflater.inflate(R.menu.menu, menu);
}
}
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_add://转到Info界面添加联系人
ToInfo();
break;
case R.id.menu_del:
usersDao.delete(choosed);
UpdateView();
break;
case R.id.menu_call://系统拨号
//用intent启动拨打电话
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+choosed.getTelnum()));
startActivity(intent);
break;
case R.id.menu_edit://转到Info界面修改联系人
ToInfo(choosed, true);
break;
case R.id.menu_info://转到Info界面查看联系人
ToInfo(choosed, false);
break;
case R.id.menu_input://导入系统联系人
getSystemInfo();
break;
}
return super.onContextItemSelected(item);
}
}