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

因为用于显示短信的历史记录的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值