public class Main extends Activity implements View.OnClickListener{private boolean mDTMFToneEnabled;private Object mToneGeneratorLock = new Object();private ToneGenerator mToneGenerator;private static final int TONE_LENGTH_MS = 150;private static final int TONE_RELATIVE_VOLUME = 80;private static final int DIAL_TONE_STREAM_TYPE = AudioManager.STREAM_MUSIC;private EditText mDigits;private ImageButton deleteIMB;private ImageButton dialIMB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.dialmain);mDigits = (EditText) findViewById(R.id.digits);deleteIMB=(ImageButton) findViewById(R.id.delete_back);dialIMB=(ImageButton) findViewById(R.id.start_dial);deleteIMB.setOnClickListener(this);dialIMB.setOnClickListener(this);setupKeypad();}private void setupKeypad() {// Setup the listeners for the buttonsfindViewById(R.id.zero).setOnClickListener(this);findViewById(R.id.one).setOnClickListener(this);findViewById(R.id.two).setOnClickListener(this);findViewById(R.id.three).setOnClickListener(this);findViewById(R.id.four).setOnClickListener(this);findViewById(R.id.five).setOnClickListener(this);findViewById(R.id.six).setOnClickListener(this);findViewById(R.id.seven).setOnClickListener(this);findViewById(R.id.eight).setOnClickListener(this);findViewById(R.id.nine).setOnClickListener(this);findViewById(R.id.star).setOnClickListener(this);findViewById(R.id.pound).setOnClickListener(this);}@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();mDTMFToneEnabled = Settings.System.getInt(getContentResolver(),Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;synchronized (mToneGeneratorLock) {if (mToneGenerator == null) {try {// we want the user to be able to control the volume of the// dial tones// outside of a call, so we use the stream type that is also// mapped to the// volume control keys for this activitymToneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE,TONE_RELATIVE_VOLUME);setVolumeControlStream(DIAL_TONE_STREAM_TYPE);} catch (RuntimeException e) {mToneGenerator = null;}}}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.one: {playTone(ToneGenerator.TONE_DTMF_1);keyPressed(KeyEvent.KEYCODE_1);return;}case R.id.two: {playTone(ToneGenerator.TONE_DTMF_2);keyPressed(KeyEvent.KEYCODE_2);return;}case R.id.three: {playTone(ToneGenerator.TONE_DTMF_3);keyPressed(KeyEvent.KEYCODE_3);return;}case R.id.four: {playTone(ToneGenerator.TONE_DTMF_4);keyPressed(KeyEvent.KEYCODE_4);return;}case R.id.five: {playTone(ToneGenerator.TONE_DTMF_5);keyPressed(KeyEvent.KEYCODE_5);return;}case R.id.six: {playTone(ToneGenerator.TONE_DTMF_6);keyPressed(KeyEvent.KEYCODE_6);return;}case R.id.seven: {playTone(ToneGenerator.TONE_DTMF_7);keyPressed(KeyEvent.KEYCODE_7);return;}case R.id.eight: {playTone(ToneGenerator.TONE_DTMF_8);keyPressed(KeyEvent.KEYCODE_8);return;}case R.id.nine: {playTone(ToneGenerator.TONE_DTMF_9);keyPressed(KeyEvent.KEYCODE_9);return;}case R.id.zero: {playTone(ToneGenerator.TONE_DTMF_0);keyPressed(KeyEvent.KEYCODE_0);return;}case R.id.pound: {playTone(ToneGenerator.TONE_DTMF_P);keyPressed(KeyEvent.KEYCODE_POUND);return;}case R.id.star: {playTone(ToneGenerator.TONE_DTMF_S);keyPressed(KeyEvent.KEYCODE_STAR);return;}  case R.id.delete_back:{  keyPressed(KeyEvent.KEYCODE_DEL);  return;   }  case R.id.start_dial://  intent   return;   }//case R.id.deleteButton: {//keyPressed(KeyEvent.KEYCODE_DEL);//return;}void playTone(int tone) {// if local tone playback is disabled, just return.if (!mDTMFToneEnabled) {return;}// Also do nothing if the phone is in silent mode.// We need to re-check the ringer mode for *every* playTone()// call, rather than keeping a local flag that's updated in// onResume(), since it's possible to toggle silent mode without// leaving the current activity (via the ENDCALL-longpress menu.)AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);int ringerMode = audioManager.getRingerMode();if ((ringerMode == AudioManager.RINGER_MODE_SILENT)|| (ringerMode == AudioManager.RINGER_MODE_VIBRATE)) {return;}synchronized (mToneGeneratorLock) {if (mToneGenerator == null) {return;}// Start the new tone (will stop any playing tone)mToneGenerator.startTone(tone, TONE_LENGTH_MS);}}private void keyPressed(int keyCode) {// mHaptic.vibrate();KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);mDigits.onKeyDown(keyCode, event);}}

解析Google原码得到:



源码下载见资源




更多相关文章

  1. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. Android学习笔记(1)-永远不变的Hello World
  4. 一定要看的 Android(安卓)资源目录的相关知识 raw drwable value
  5. 如何进行资源的热修复
  6. Android学习资源大全
  7. Android的线程详解(几种实现方法及区别)
  8. android三个特殊的资源目录 /res/xml /res/raw 和 /assets
  9. Android移动安全(一)Android混淆机制

随机推荐

  1. Android(安卓)am命令
  2. android ViewPager 竖向滑动
  3. js 中判断手机是iphone,ipad还是Android、
  4. [android]Context 上下文
  5. android TextView ellipsize 只显示一个
  6. 2013.12.23 ——— android assents文件
  7. Android(安卓)NDK JNI 入门笔记-day01-创
  8. Android获取手机屏幕的宽高
  9. 2011.08.15(2)——— android audioManager
  10. Android(安卓)近百个项目的源代码