您的位置:首页 > 产品设计 > UI/UE

Android-节日短信送祝福(UI篇:3-选择联系人、发送短信、显示历史记录)

2016-02-23 01:04 746 查看
因为用于显示短信的历史记录的Fragment已经实现了,所以先修改好MainActivity中mViewPager的适配器里面的逻辑,就可以实现显示历史记录了,很简单:

mViewPager.setAdapter(new FragmentPagerAdapter(
getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
//在ViewPager与Tab的联系后,会多次(具体次数等于getCount)调用getItem
if (position==0) return new FestivalCategoryFragment();
else return new SmsHistoryFragment();
}
...
});


然后需要实现与短信有关的业务类SmsBiz

public class SmsBiz {

private Context context;

public SmsBiz(Context context) {
this.context=context;
}

/**
*
* @param number
* @param msgContent
* @param sentPi
* @param deliverPi
* @return 返回短信的条数(有可能短信内容比较长,要做分割)
**/
public int sendMsg(String number, String msgContent, PendingIntent sentPi, PendingIntent deliverPi) {
SmsManager smsManager=SmsManager.getDefault();
ArrayList<String> contents=smsManager.divideMessage(msgContent);

//分割后单条短信的发送
for(String content:contents) {
smsManager.sendTextMessage(number,null,content,sentPi,deliverPi);
}

return contents.size();
}

//有可能需要发送的联系人不止一个
public int sendMsg(Set<String> numbers, SendedMsg msg, PendingIntent sentPi, PendingIntent deliverPi) {
save(msg);//存入数据库中
int result=0;
for(String number:numbers) {
int count=sendMsg(number,msg.getContent(),sentPi,deliverPi);
result+=count;
}

return result;
}

//因为这里只涉及数据库的增和查,所以这里直接写在业务层下
//但是如果涉及到的数据库的操作比较多(增删改查,以及按条件查询等),最好在项目的包下建立一个"dao"层
//或者在"db"下增加一个相关操作的类,然后业务层就可以根据其实例去访问数据库的一些内容
private void save(SendedMsg sendedMsg) {
sendedMsg.setDate(new Date());
ContentValues values=new ContentValues();
values.put(SendedMsg.COLUMN_DATE,sendedMsg.getDate().getTime());
values.put(SendedMsg.COLUMN_FESTIVAL_NAME,sendedMsg.getFestivalName());
values.put(SendedMsg.COLUMN_CONTENT,sendedMsg.getContent());
values.put(SendedMsg.COLUMN_NAMES,sendedMsg.getNames());
values.put(SendedMsg.COLUMN_NUMBERS,sendedMsg.getNumbers());

context.getContentResolver().insert(SmsProvider.URI_SMS_ALL,values);
}
}


在分割后的单条短信发送后,会发送两个广播,然后再SendMsgActivity就可以掌握到短信发送的情况了。

最后就是在SendMsgActivity实现选择联系人与发生短信的逻辑了(需要注意,相比于UI篇中,除了增加了代码,某些地方也做了一下改动):

public class SendMsgActivity extends AppCompatActivity {
public static final String KEY_ID_FESTIVAL="FestivalId";
public static final String KEY_ID_MSG="MsgId";

private static final int CODE_REQUEST=1;

private int mFestivalId;
private int mMsgId;

private Festival mFestival;
private Msg mMsg;

private EditText mEdMsg;
private Button mBtnAdd;
private FlowLayout mFlContacts;
private FloatingActionButton mFabSend;//用于发送短信的FloatingActionButton
private View mLayoutLoading;

private Set<String> mContactNames=new HashSet<>();
private Set<String> mContactNums=new HashSet<>();

private LayoutInflater mInflater;

private static final String ACTION_SEND_MSG="ACTION_SEND_MSG";
private static final String ACTION_DELIVER_MSG="ACTION_DELIVER_MSG";

private PendingIntent mSendPi;
private PendingIntent mDeliverPi;
private BroadcastReceiver mSendBroadcastReceiver;
private BroadcastReceiver mDeliverBroadcastReceiver;

private SmsBiz mSmsBiz;

private int mMsgSendCount;//用来记录发送次数
private int mTotalCount;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_msg);

mInflater=LayoutInflater.from(this);

mSmsBiz=new SmsBiz(this);

initDatas();

initViews();

initEvents();

initRecivers();
}

private void initRecivers() {
Intent sendIntent=new Intent(ACTION_SEND_MSG);
mSendPi=PendingIntent.getBroadcast(this,0,sendIntent,0);
Intent deliverIntent=new Intent(ACTION_DELIVER_MSG);
mDeliverPi=PendingIntent.getBroadcast(this,0,deliverIntent,0);

registerReceiver(mSendBroadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//因为是每个分割的短信发送后都会发送一个广播,所以这里每次在接受广播后都要累加(不管发送成功与否),直至等于分割的短信的总数
mMsgSendCount++;

if(getResultCode()==RESULT_OK) {
Log.d("测试","短信发送成功"+(mMsgSendCount+"/"+mTotalCount));
}
else {
Log.d("测试","短信发送失败");
}
Toast.makeText(SendMsgActivity.this,(mMsgSendCount+"/"+mTotalCount)+"短信已经发送",Toast.LENGTH_SHORT).show();
if(mMsgSendCount==mTotalCount) {
finish();
}
}
},new IntentFilter(ACTION_SEND_MSG));

registerReceiver(mDeliverBroadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("测试","联系人已经成功接收短信");
}
},new IntentFilter(ACTION_DELIVER_MSG));
}

private void initEvents() {
mBtnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent,CODE_REQUEST);
}
});

mFabSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mContactNums.size()==0) {
Toast.makeText(SendMsgActivity.this,"请先添加联系人!",Toast.LENGTH_SHORT).show();
return;
}
String msgContent=mEdMsg.getText().toString();
if(TextUtils.isEmpty(msgContent)) {
Toast.makeText(SendMsgActivity.this,"短信内容不能为空!",Toast.LENGTH_SHORT).show();
return;
}
mLayoutLoading.setVisibility(View.VISIBLE);
mMsgSendCount=0;
mTotalCount=mSmsBiz.sendMsg(mContactNums,buildSendedMsg(msgContent),mSendPi,mDeliverPi);
}
});
}

private SendedMsg buildSendedMsg(String msgContent) {
SendedMsg sendedMsg=new SendedMsg();
sendedMsg.setContent(msgContent);
sendedMsg.setFestivalName(mFestival.getName());
StringBuilder names=new StringBuilder();
for (String name:mContactNames) {
names.append(name+",");
}
sendedMsg.setNames(names.substring(0,names.length()-1));
StringBuilder numbers=new StringBuilder();
for (String number:mContactNums) {
numbers.append(number+",");
}
sendedMsg.setNumbers(numbers.substring(0,numbers.length()-1));
return sendedMsg;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(requestCode==CODE_REQUEST) {
if(resultCode==RESULT_OK) {
Uri contactUri=data.getData();//这里得到的Uri是选定的联系人的特定Uri
Cursor cursor=getContentResolver().query(contactUri,null,null,null,null);
if (cursor!=null) {
cursor.moveToFirst();
String contactName=cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

String number=getContactNumber(cursor);

cursor.close();

//如果number不存在,就不需要添加contactName与number
if(!TextUtils.isEmpty(number)) {
mContactNums.add(number);
mContactNames.add(contactName);

addTag(contactName);
}
}
}
}
}

/**
* 将选定的联系人添加进FlowLayout中
* @param contactName
*/
private void addTag(String contactName) {
TextView textView= (TextView) mInflater.inflate(R.layout.tag,mFlContacts,false);
textView.setText(contactName);
mFlContacts.addView(textView);
}

private String getContactNumber(Cursor cursor) {
int numberCount=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
String number=null;
if(numberCount>0) {
int contactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));

Cursor phoneCursor=getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+" = "+contactId,null,null);
phoneCursor.moveToFirst();

//可能phoneCursor中会存在多个号码(因为可能同一个联系人下存有多种号码,如手机、单位等),这里只简单的获取第一个
number=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

phoneCursor.close();
}
return number;
}

private void initViews() {
mEdMsg= (EditText) findViewById(R.id.id_et_content);
mBtnAdd= (Button) findViewById(R.id.id_btn_add);
mFlContacts= (FlowLayout) findViewById(R.id.id_fl_contacts);
mFabSend= (FloatingActionButton) findViewById(R.id.id_fab_send);
mLayoutLoading=findViewById(R.id.id_layout_loading);

mLayoutLoading.setVisibility(View.GONE);

if(mMsgId!=-1) {
mMsg= FestivalLab.getInstance().getMsgByFestivalIdAndMsgId(mFestivalId,mMsgId);
mEdMsg.setText(mMsg.getContent());
}
}

private void initDatas() {
mFestivalId=getIntent().getIntExtra(KEY_ID_FESTIVAL,-1);
mMsgId=getIntent().getIntExtra(KEY_ID_MSG,-1);

mFestival=FestivalLab.getInstance().getFestivalById(mFestivalId);
setTitle(mFestival.getName());
}

public static void toActivity(Context context, int festivalId, int msgId) {
Intent intent=new Intent(context,SendMsgActivity.class);
intent.putExtra(KEY_ID_FESTIVAL,festivalId);
intent.putExtra(KEY_ID_MSG,msgId);
context.startActivity(intent);
}

@Override
protected void onDestroy() {
super.onDestroy();

unregisterReceiver(mSendBroadcastReceiver);
unregisterReceiver(mDeliverBroadcastReceiver);
}
}


选择联系人的时候,是跳转到了系统的页面,当然,也可以自己去编写一个页面,貌似在慕课网就有相关教程。

源码:http://download.csdn.net/download/qq_22804827/9439732
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: