2010年12月5日 星期日

[Android] 如何發送簡訊並使用自訂的AlertDialog (How to send SMS and use custom AlertDialog)



就如標題說個該如何使用Android發送簡訊? 而對於使用自訂的AlertDialog , Android的Dev Guide有篇文章講解的很不錯 , 讓AlertDialog不再那麼單調了。


首先是程式碼的部分


package com.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class SMSAlertDialog extends Activity implements Button.OnClickListener
{
    /** Called when the activity is first created. */
    
 @Override
    public void onCreate(Bundle savedInstanceState)
 {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ButtonContact = (Button) findViewById(R.id.ButtonContact);
        ButtonContact.setOnClickListener(this);
        
        EditTextMS = (EditText) findViewById(R.id.EditTextMS);
  
    }
 
 AlertDialog alertDialog;
 Button ButtonContact , ButtonOk , ButtonCancel;
 EditText EditTextMS , EditTextNumber;

 @Override
 public void onClick(View ButtonView)
 {
  // TODO Auto-generated method stub
  
  switch(ButtonView.getId())
  {
      case R.id.ButtonContact:
      showAlertDialog();
         break;
         
         case R.id.ButtonOk:
         SmsManager smsManager = SmsManager.getDefault();
         //想獲得SmsManager物件必須呼叫static method SmsManager.getDefault().
         //API Level 4 開始使用 android.telephony.SmsManager裡的 SmsManager.getDefault();
            //API Level 1的android.telephony.gsm.SmsManager已不被推薦使用

      PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(), 0);
      //getBroadcast(Context context, int requestCode, Intent intent, int flags)
      //關於flags的說明可以參考官方的API Doc
      //http://developer.android.com/reference/android/app/PendingIntent.html
      smsManager.sendTextMessage(EditTextNumber.getText().toString(), null, EditTextMS.getText().toString(), pendingIntent, null);
      //傳送SMS
      Log.d(EditTextNumber.getText().toString(), EditTextMS.getText().toString());
      alertDialog.dismiss();      
      
      break;
         
         case R.id.ButtonCancel:      
            alertDialog.dismiss();            
      break;
  }
  
 }

 private void showAlertDialog()
 {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);   
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);

    final View layout = inflater.inflate(
     R.layout.customalertdialog, (LinearLayout) findViewById(R.id.layout_root));
    //將customalertdialog.xml中的 R.id.layout_root的LinearLayout並return 一個View
   
    ImageView ImageViewPhone = (ImageView) layout.findViewById(R.id.ImageViewPhone);
    //因為要取出LinearLayout裡的元素 , 所以 要使用layout來呼叫findViewById(int R.id) method
    //否則會出現NullPointerException    
    ImageViewPhone.setImageResource(R.drawable.phone);
    
    EditTextNumber = (EditText) layout.findViewById(R.id.EditTextNumber);
       
    ButtonOk = (Button) layout.findViewById(R.id.ButtonOk);
    ButtonOk.setOnClickListener(this);
    ButtonCancel = (Button) layout.findViewById(R.id.ButtonCancel);
    ButtonCancel.setOnClickListener(this);
    
    builder = new AlertDialog.Builder(this);   
    builder.setTitle("連絡人號碼");
    builder.setView(layout);
    
    alertDialog = builder.create();
    //當一切都設置完成之後才可以create()
    alertDialog.show();
    //顯示AlertDialog
 }
}


由於我把custom AlertDialog的Layout存在另一個檔案customalertdialog.xml , 以下是他的內容



















接下來是main.xml的內容










最後只要記得在AndroidManifest加上使用者權限就ok了







連絡人號碼我使用5556 , 是代表另一個模擬器的名稱 , 而我在IDEOS上測試過了也沒問題


這個5556模擬器已經收到來自剛剛5554模擬器發出的簡訊了


沒有留言:

張貼留言

Google Analytics