1.2.1 案例-IP 拨号器

1.2.1 案例-IP 拨号器
一、需求
什么是IP 拨号服务?我们为什么要用IP 服务?所谓的IP 拨号就是通过接入数据网络来传播语音信
息。IP 拨号的目的在于转接至其他频道,减少话费等用处。移动17951,联通17911,打长途时在电话号
码前加上这个就便宜了,如果你的手机上有这个键的话,那么打电话时输入长途电话号码后,直接按那个
键就拨出去了,它会自动加上IP。通俗的说就是打长途便宜。
例如手机拨打长途电话:
移动拨区号+电话号=0.25/分市话+0.7/分长途=0.95/分;
移动拨17951+区号+电话号=0.25/分市话+0.3/分长途=0.55/分。
图1-1 IP 播放器原理
了解了IP 拨号的用途之后,接下来,我们通过程序在用户拨出去的号码前自动加上一个IP 号码,为
用户省钱。
之所以能实现这样的功能,是因为拨号的时候Android 系统会发送一个有序广播,该广播中携带了用
户拨打的号码,我们通过注册广播接收者就可以获取到该广播,同时将该广播中的数据进行修改。从而实
上海黑马程序员——只要学不死,就往死里学,冲击年薪20 万!
4
现了用户号码自动加IP 号的功能。
为了能让用户自己决定IP 号码,我们需要一个界面(如图1-2),让那个用户输入IP 号码,然后将该
IP 号码保存到SharedPreferences 中。
图1-2 IP 拨号器界面
二、布局
图1-2 所示的布局代码如下所示。
【文件1-1】activity_main.xml
1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:orientation="vertical">
6.
7. <EditText
8. android:id="@+id/et_ip"
9. android:hint="请输入IP 号码,默认17951"
10. android:layout_width="match_parent"
11. android:layout_height="wrap_content" />
12. <Button
13. android:onClick="saveIP"
14. android:layout_width="wrap_content"
15. android:layout_height="wrap_content"
16. android:text="保存"
17. />
18.
19. </LinearLayout>
20.
三、代码
在该案例中总共用到了两个类一个是MainActivity.java 负责让用户输入IP 号码,另外一个是自定义的
上海黑马程序员——只要学不死,就往死里学,冲击年薪20 万!
5
广播接收者IPCallerReceiver 负责监听用户的拨打电话事件。
【文件1-2】MainActivity.java
1. package com.itheima.android.ipcaller;
2.
3. import android.os.Bundle;
4. import android.app.Activity;
5. import android.content.SharedPreferences;
6. import android.text.TextUtils;
7. import android.view.View;
8. import android.widget.EditText;
9. import android.widget.Toast;
10. /**
11. * 保存用户的IP 号码
12. *
13. * @author wzy 2015-11-18
14. *
15. */
16. public class MainActivity extends Activity {
17.
18. private EditText et_ip;
19. private SharedPreferences sp;
20. @Override
21. protected void onCreate(Bundle savedInstanceState) {
22. super.onCreate(savedInstanceState);
23. setContentView(R.layout.activity_main);
24. //文本编辑控件
25. et_ip = (EditText) findViewById(R.id.et_ip);
26. //获取sp 对象
27. sp = getSharedPreferences("config", MODE_PRIVATE);
28. }
29. //保存IP 号码
30. public void saveIP(View view){
31. String ipNum = et_ip.getText().toString().trim();
32. //如果为空则保存默认值
33. if (TextUtils.isEmpty(ipNum)) {
34. sp.edit().putString("ip", "17951").commit();
35. }else {
36. sp.edit().putString("ip", ipNum).commit();
37. }
38. Toast.makeText(this, "IP 号码保存成功", Toast.LENGTH_SHORT).show();
39. }
40.
41. }
42.
编写自定义广播接收者需要自定义一个类然后继承系统提供的BroadCastReceiver 类,然后覆写抽象方
上海黑马程序员——只要学不死,就往死里学,冲击年薪20 万!
6
法onReceive。
【文件1-3】IPCallerReceiver.java
1. package com.itheima.android.ipcaller;
2.
3. import android.content.BroadcastReceiver;
4. import android.content.Context;
5. import android.content.Intent;
6. import android.content.SharedPreferences;
7. import android.text.TextUtils;
8. import android.util.Log;
9. /**
10. * 自定义广播接收者
11. *
12. * @author wzy 2015-11-18
13. *
14. */
15. public class IPCallerReceiver extends BroadcastReceiver {
16.
17. @Override
18. public void onReceive(Context context, Intent intent) {
19. //获取数据
20. String resultData = getResultData();
21. Log.d("tag", "接收到广播:"+resultData);
22. //从SharedPreferences 中获取用户保存的IP 号码
23. SharedPreferences sp =
24. context.getSharedPreferences("config", Context.MODE_PRIVATE);
25. String ipNum = sp.getString("ip", "17951");
26. if (!TextUtils.isEmpty(ipNum)) {
27. //修改数据
28. resultData = ipNum+resultData;
29. }
30. //将修改后的数据设置出去
31. setResultData(resultData);
32. }
33.
34. }
四、在清单文件中进行注册
广播是Android 四大组件之一,因此需要在AndroidManifest.xml 中进行注册。同时监听用户的拨打电
话行为也属于侵犯用户隐私的行为,因此需要添加权限。
1、注册广播
上海黑马程序员——只要学不死,就往死里学,冲击年薪20 万!
7
【文件1-4】注册广播
1. <receiver android:name="com.itheima.android.ipcaller.IPCallerReceiver">
2. <intent-filter >
3. <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
4. </intent-filter>
5. </receiver>
大家可以发现广播接收者的注册也需要通过intent-filter 来监听特定的广播,如果是监听Android 系统
的,那么在action 中就需要配置系统提供的常量。如果监听自定义发送的广播,那么就需要配置自定义广
播设置的action。
2、声明权限
【文件1-5】添加权限
1. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

你可能感兴趣的:(1.2.1 案例-IP 拨号器)