Android 製作群發簡訊並查詢發送狀態(TextWatcher,BroadcastReceiver)
功能簡單
一、可以選取通訊錄名單
二、可以跟據名單群體發送
三、可以查詢發送狀態(是否送出成功)
四、可以監聽文字變化事件
不過有些小地方卡了一下做個紀錄:
TextWatcher:用來監聽EditText裡文字變化事件
BroadcastReceiver:廣播接收元件,用來監聽有沒有Intent呼叫
Intent就像要做件事的意圖
IntentFilter是用來過濾Intent有沒有相符的元件
舉個郵局的比喻
Intent就像信封
IntentFilter就像寫在上面的地址
信封(Intent) 寫好發出時
郵差(Android系統) 會跟據上面的
地址(IntentFilter) 去送信
BroadcastReceiver會跟據信的內容去做它的事
我知道這個比喻不太完美
因為Intent不只對BroadcastReceiver
還可以用在Action、Service
不過先這樣吧~
TextWatcher就簡單多了,有時有些欄位是必填的
可以用這監聽有沒有填寫,或者還可以對應
Regular Expression 正則表示式 (一直覺得這翻譯好帥,正則表示式)
限制字數、規範等等
程式碼:
一、可以選取通訊錄名單
二、可以跟據名單群體發送
三、可以查詢發送狀態(是否送出成功)
四、可以監聽文字變化事件
不過有些小地方卡了一下做個紀錄:
TextWatcher:用來監聽EditText裡文字變化事件
BroadcastReceiver:廣播接收元件,用來監聽有沒有Intent呼叫
Intent就像要做件事的意圖
IntentFilter是用來過濾Intent有沒有相符的元件
舉個郵局的比喻
Intent就像信封
IntentFilter就像寫在上面的地址
信封(Intent) 寫好發出時
郵差(Android系統) 會跟據上面的
地址(IntentFilter) 去送信
BroadcastReceiver會跟據信的內容去做它的事
我知道這個比喻不太完美
因為Intent不只對BroadcastReceiver
還可以用在Action、Service
不過先這樣吧~
TextWatcher就簡單多了,有時有些欄位是必填的
可以用這監聽有沒有填寫,或者還可以對應
Regular Expression 正則表示式 (一直覺得這翻譯好帥,正則表示式)
限制字數、規範等等
程式碼:
public static class PlaceholderFragment extends Fragment { Button choice,send; EditText inputText,etList; HashMapname_number; public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); choice = (Button) rootView.findViewById(R.id.choice); send = (Button) rootView.findViewById(R.id.send); inputText = (EditText) rootView.findViewById(R.id.inputText); etList = (EditText) rootView.findViewById(R.id.etList); //設定IntentFilter過濾器 IntentFilter iFilter = new IntentFilter("SMS_SEND_ACTION"); //new出自訂的BroadcastReceiver myBroadcastReceiver receiver = new myBroadcastReceiver(); //將其註冊 getActivity().registerReceiver(receiver, iFilter); //new出清單 name_number = new HashMap<>(); //先將發送鈕false send.setEnabled(false); //設定文字變化監聽事件 inputText.addTextChangedListener(watcher); etList.addTextChangedListener(watcher); //設定選取連絡人事件 choice.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //呼叫連絡人選取名單(單選) Uri uri = Uri.parse("content://contacts/people"); Intent intent = new Intent(Intent.ACTION_PICK,uri); startActivityForResult(intent, 1); } }); //設定按下發送事件 send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //從Map裡將清單撈出並逐一發送 Set keys = name_number.keySet(); Iterator iterator = keys.iterator(); while(iterator.hasNext()){ Object key = iterator.next(); String phone = name_number.get(key); sendText(phone,v); v.setEnabled(false); } } }); return rootView; } //--------------------------------------------------------------- //監聽文字變化事件----------------------------------------------- private TextWatcher watcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //若文字為空,則不能發送 if(etList.getText().length() == 0 || inputText.getText().length() == 0){ send.setEnabled(false); }else { send.setEnabled(true); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }; //-------------------------------------------------------------------- //發送訊息-------------------------------------------------------- public void sendText(String number,View v){ Intent sendIntent = new Intent("SMS_SEND_ACTION"); PendingIntent pi = PendingIntent.getBroadcast(getActivity(), 0,sendIntent , 0); SmsManager smsManager = SmsManager.getDefault(); String text = inputText.getText().toString(); smsManager.sendTextMessage(number, null, text, pi, null); v.setEnabled(true); } //-------------------------------------------------------------------- //選取聯絡人視窗------------------------------------------------------ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { //除了要檢查requestCode是否相符 //data也要檢查是否為null if(requestCode == 1 && data != null){ Uri myuri = data.getData(); if(myuri != null){ try{ //找出姓名 Cursor cursor = getActivity().getContentResolver() .query(myuri, null, null, null, null); cursor.moveToFirst(); //取得姓名 String name = cursor.getString( cursor.getColumnIndex(Contacts.DISPLAY_NAME)); //取得ID long id = cursor.getLong( cursor.getColumnIndex(Contacts._ID)); //依ID 找出電話 Cursor cursorNumber = getActivity().getContentResolver() .query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=" + Long.toString(id), null, null); String phonenumber = ""; while(cursorNumber.moveToNext()){ phonenumber = cursorNumber.getString( cursorNumber.getColumnIndex(Phone.NUMBER)); } //如果name_number裡有值且對應到姓名 //表示重複則移除,不然就加進去 if(phonenumber.equals(name_number.get(name))){ name_number.remove(name); }else{ name_number.put(name, phonenumber); } String list = reFlashlist(name_number); etList.setText(list); }catch(Exception e){ e.printStackTrace(); } } } super.onActivityResult(requestCode, resultCode, data); } //---------------------------------------------------------------- //重整選擇畫面---------------------------------------------------- public String reFlashlist(HashMap name_number){ String tempNamePhone=""; Set keyName = name_number.keySet(); Iterator iterator = keyName.iterator(); while(iterator.hasNext()){ Object key = iterator.next(); String temString = (String) key; String temPhone = name_number.get(key); tempNamePhone += temString +":" +temPhone+"\n"; } return tempNamePhone; } //-------------------------------------------------------------------- //設定BroadcastReceiver----------------------------------------------- public class myBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { switch (getResultCode()) { //getResultCode()取得送出後回傳的代碼 //依代碼決定顯示什麼提醒 case Activity.RESULT_OK: Toast.makeText(getActivity(), "發送成功"+getResultCode(),Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(getActivity(), "發送失敗",Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(getActivity(), "飛航模式",Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(getActivity(), "未知"+getResultData() ,Toast.LENGTH_SHORT).show(); break; } } } }
留言
張貼留言