实验9:Android综合实验

1. 播报数字

+1. 声明并初始化SoundPool类、HashMap类的实例化对象sp和spMap

  1. private HashMap<String, Integer> spMap=null; //用于管理音频流
  2. private SoundPool sp; // 音频池
  3. private int soundId; // 音频ID
  4. protected void onCreate(Bundle savedInstanceState) {
  5. .
  6. .
  7. .
  8. // 初始化HashMap<String, Integer>类的实例对象spMap
  9. spMap = new HashMap<>();
  10. // 初始化SoundPool类的实例对象sp,并设置最多可容纳16个音频流
  11. sp = new SoundPool(16, AudioManager.STREAM_MUSIC, 0);
  12. .
  13. .
  14. .
  15. }
  1. 加载音频文件,并用HashMap类来管理加载的音频文件;为按钮添加点击事件
    1. // 用SoundPool类的load方法加载指定音频文件,并用soundId保存返回的音频ID。
    2. // 用HashMap类来管理这些音频流
    3. soundId = sp.load(this, R.raw.zero, 1);
    4. spMap.put("0", soundId);
    5. soundId = sp.load(this, R.raw.one, 1);
    6. spMap.put("1", soundId);
    7. soundId = sp.load(this, R.raw.two, 1);
    8. spMap.put("2", soundId);
    9. soundId = sp.load(this, R.raw.three, 1);
    10. spMap.put("3", soundId);
    11. soundId = sp.load(this, R.raw.four, 1);
    12. spMap.put("4", soundId);
    13. soundId = sp.load(this, R.raw.five, 1);
    14. spMap.put("5", soundId);
    15. soundId = sp.load(this, R.raw.six, 1);
    16. spMap.put("6", soundId);
    17. soundId = sp.load(this, R.raw.seven, 1);
    18. spMap.put("7", soundId);
    19. soundId = sp.load(this, R.raw.eight, 1);
    20. spMap.put("8", soundId);
    21. soundId = sp.load(this, R.raw.nine, 1);
    22. spMap.put("9", soundId);
    23. soundId = sp.load(this, R.raw.ac, 1);
    24. spMap.put("ac", soundId);
    25. soundId = sp.load(this, R.raw.del, 1);
    26. spMap.put("del", soundId);
    27. soundId = sp.load(this, R.raw.div, 1);
    28. spMap.put("div", soundId);
    29. soundId = sp.load(this, R.raw.dot, 1);
    30. spMap.put(".", soundId);
    31. soundId = sp.load(this, R.raw.equal, 1);
    32. spMap.put("equal", soundId);
    33. soundId = sp.load(this, R.raw.minus, 1);
    34. spMap.put("minus", soundId);
    35. soundId = sp.load(this, R.raw.mul, 1);
    36. spMap.put("mul", soundId);
    37. soundId = sp.load(this, R.raw.plus, 1);
    38. spMap.put("plus", soundId);
    39. // 为按钮设置点击监听事件
    40. findViewById(R.id.btn0).setOnClickListener(this);
    41. findViewById(R.id.btn1).setOnClickListener(this);
    42. findViewById(R.id.btn2).setOnClickListener(this);
    43. findViewById(R.id.btn3).setOnClickListener(this);
    44. findViewById(R.id.btn4).setOnClickListener(this);
    45. findViewById(R.id.btn5).setOnClickListener(this);
    46. findViewById(R.id.btn6).setOnClickListener(this);
    47. findViewById(R.id.btn7).setOnClickListener(this);
    48. findViewById(R.id.btn8).setOnClickListener(this);
    49. findViewById(R.id.btn9).setOnClickListener(this);
    50. findViewById(R.id.btnadd).setOnClickListener(this);
    51. findViewById(R.id.btnsub).setOnClickListener(this);
    52. findViewById(R.id.btnmul).setOnClickListener(this);
    53. findViewById(R.id.btndiv).setOnClickListener(this);
    54. findViewById(R.id.btnclr).setOnClickListener(this);
    55. findViewById(R.id.btneq).setOnClickListener(this);
  2. 根据点击按钮的侦听事件,确定播放哪个音频文件
    1. public void onClick(View v) {
    2. switch(v.getId()){
    3. case R.id.btn0:
    4. textView1.append("0"); //在UI界面的TextView中显示 0
    5. sp.play(spMap.get("0"), 1, 1, 0, 0, 1); //播放音频流
    6. break;
    7. case R.id.btn1:
    8. textView1.append("1");
    9. sp.play(spMap.get("1"), 1, 1, 0, 0, 1);
    10. break;
    11. case R.id.btn2:
    12. textView1.append("2");
    13. sp.play(spMap.get("2"), 1, 1, 0, 0, 1);
    14. break;
    15. case R.id.btn3:
    16. textView1.append("3");
    17. sp.play(spMap.get("3"), 1, 1, 0, 0, 1);
    18. break;
    19. case R.id.btn4:
    20. textView1.append("4");
    21. sp.play(spMap.get("4"), 1, 1, 0, 0, 1);
    22. break;
    23. case R.id.btn5:
    24. textView1.append("5");
    25. sp.play(spMap.get("5"), 1, 1, 0, 0, 1);
    26. break;
    27. case R.id.btn6:
    28. textView1.append("6");
    29. sp.play(spMap.get("6"), 1, 1, 0, 0, 1);
    30. break;
    31. case R.id.btn7:
    32. textView1.append("7");
    33. sp.play(spMap.get("7"), 1, 1, 0, 0, 1);
    34. break;
    35. case R.id.btn8:
    36. textView1.append("8");
    37. sp.play(spMap.get("8"), 1, 1, 0, 0, 1);
    38. break;
    39. case R.id.btn9:
    40. textView1.append("9");
    41. sp.play(spMap.get("9"), 1, 1, 0, 0, 1);
    42. break;
    43. case R.id.btnadd:
    44. sp.play(spMap.get("plus"), 1, 1, 0, 0, 1);
    45. items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
    46. checkAndcompute();
    47. items.add(new Item(0, Type.add));
    48. textView1.setText("");
    49. break;
    50. case R.id.btnsub:
    51. sp.play(spMap.get("minus"), 1, 1, 0, 0, 1);
    52. items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
    53. checkAndcompute();
    54. items.add(new Item(0, Type.sub));
    55. textView1.setText("");
    56. break;
    57. case R.id.btnmul:
    58. sp.play(spMap.get("mul"), 1, 1, 0, 0, 1);
    59. items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
    60. checkAndcompute();
    61. items.add(new Item(0, Type.mul));
    62. textView1.setText("");
    63. break;
    64. case R.id.btndiv:
    65. sp.play(spMap.get("div"), 1, 1, 0, 0, 1);
    66. items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
    67. checkAndcompute();
    68. items.add(new Item(0, Type.div));
    69. textView1.setText("");
    70. break;
    71. case R.id.btneq:
    72. sp.play(spMap.get("equal"), 1, 1, 0, 0, 1);
    73. items.add(new Item(Double.parseDouble(textView1.getText().toString()), Type.num));
    74. checkAndcompute();
    75. textView1.setText(items.get(0).value + "");
    76. String str = items.get(0).value+"";
    77. new Test(str).start(); // 启动另一个线程来播放结果
    78. items.clear();
    79. break;
    80. case R.id.btnclr:
    81. sp.play(spMap.get("ac"), 1, 1, 0, 0, 1);
    82. textView1.setText("");
    83. }
    84. }
  3. 对于结算结果的音频播放:(1)先把计算结果转成字符串型,再启动一个子线程来处理该字符串;(2)子线程获取传过来的计算结果的字符串后,停止播放的“等于”对应的音频,然后利用for循环语句和String类的substring()方法把计算结果一位一位的截取出来,并播放对应的音频文件。
    ```
    1. .
    2. .
    3. String str = items.get(0).value+"";
    4. new Test(str).start(); // 启动另一个线程来播放结果
    5. .
    6. .
    class Test extends Thread{
    1. private String result; //计算的结果
    2. public Test(String s){
    3. this.result = s;
    4. }
    5. @Override
    6. public void run() {
    7. String s;
    8. sp.stop(spMap.get("equal"));
    9. // 用for循环把计算结果分割成对应spMap中的key
    10. for(int i=0; i<result.length(); i++){
    11. try {
    12. Thread.sleep(350); //该线程睡350毫秒
    13. } catch (InterruptedException e) {
    14. e.printStackTrace();
    15. }
    16. s = result.substring(i, i+1);
    17. sp.play(spMap.get(s), 1, 1, 0, 0, 1);
    18. }
    19. }
    }