Android-节日短信送祝福(UI篇:3-选择联系人、发送短信、显示历史记录)
2016-02-23 01:04
746 查看
因为用于显示短信的历史记录的Fragment已经实现了,所以先修改好MainActivity中mViewPager的适配器里面的逻辑,就可以实现显示历史记录了,很简单:
然后需要实现与短信有关的业务类SmsBiz
在分割后的单条短信发送后,会发送两个广播,然后再SendMsgActivity就可以掌握到短信发送的情况了。
最后就是在SendMsgActivity实现选择联系人与发生短信的逻辑了(需要注意,相比于UI篇中,除了增加了代码,某些地方也做了一下改动):
选择联系人的时候,是跳转到了系统的页面,当然,也可以自己去编写一个页面,貌似在慕课网就有相关教程。
源码:http://download.csdn.net/download/qq_22804827/9439732
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
相关文章推荐
- impala+hue
- Codeforces 620D Lipshitz Sequence RMQ+二分
- Divide and Conquer
- UI视图交互与事件机制
- UINT8_T / UINT16_T / UINT32_T /UINT64_T 是什么数据类型(转)
- JSP内置对象——request内置对象(1)
- JSP内置对象——request内置对象(2)
- 关于决解EasyUI中Tabs标签页下使用百度地图API异常
- jsp继续学习(request对象)
- Theano-Deep Learning Tutorials 笔记:Modeling and generating sequences of polyphonic music with the RNN
- iOS(学习4) UIWindow 和 UIView
- Android UI效果之绘图篇(三)
- Solving “Dynamic Web Module 3.0 requires Java 1.6 or newer” in Maven Projects
- iOS 弹窗UIAlertView、UIActionSheet、UIAlertController简述 —— HERO博客
- 解析UITableViewCell的重用
- 有关error:invalid type arguement of unary'*'(hava 'int')
- Intel处理器CPUID指令学习
- iOS7.0后隐藏状态栏(UIStatusBar)
- [DevExpress]DevExpress控件库-MarqueeProgressBarControl控件跟ProgressBarControl控件
- Understanding RabbitMQ Exchange & Queue