android之短信拦截器
2024-10-16 11:44:38
下面通过短信拦截器来介绍短信中的广播
布局文件
在布局文件中可以设置需要拦截的号码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="25sp"
android:text="需要拦截的号码"/>
<EditText
android:id="@+id/phoneNum"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/sure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="确认"/>
</LinearLayout>
Activity
在Activity中获取数据并保存到本地的xml数据库中
package xidian.dy.com.chujia; import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
SharedPreferences sp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sp = getSharedPreferences("hate", Context.MODE_PRIVATE);
Button button = (Button) findViewById(R.id.sure);
if(button != null)
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText et = (EditText) findViewById(R.id.phoneNum);
if(et != null){
sp.getString("num", et.getText().toString());
Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
}
}
});
}
}
短信拦截器
package xidian.dy.com.chujia; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Telephony;
import android.telephony.SmsMessage;
import android.util.Log; /**
* Created by dy on 2016/7/11.
*/
public class SmsReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//短信的信息封装在Intent中
Bundle bundle = intent.getExtras();
Object[] objects = (Object[]) bundle.get("pdus");
SmsMessage sms;
int currentApiVversion = Build.VERSION.SDK_INT;
//拿到广播中的所有短信(有可能短信太长在发送时被拆分成多条进行发送)
for (Object obj : objects) {
if(currentApiVversion >= Build.VERSION_CODES.LOLLIPOP)
sms = SmsMessage.createFromPdu((byte[])obj, Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
else
sms = SmsMessage.createFromPdu((byte[])obj);
Log.i(this.getClass().getName(), sms.getOriginatingAddress());
Log.i(this.getClass().getName(), sms.getMessageBody()); //广播拦截
//来自1243的短信将会被拦截掉
if(sms.getOriginatingAddress().equals("1243")){
abortBroadcast();
}
}
}
}
短信的格式比较复杂(号码+信息),所以被存储在intent对象中。由于考虑的API level的问题这里需要做版本判断。调用abortBroadcast后广播将直接被销毁。
清单文件
在清单文件中需要开启短信接受权限,因为广播接受者也有优先级问题(-1000~1000),所以我们应该将我们的拦截器优先级设置为最高(1000)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xidian.dy.com.chujia">
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="主界面">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".SmsReciever">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony_SMS_RECIEVED"/>
</intent-filter>
</receiver>
</application>
</manifest>
注意
在Android4.0之后如果APP被安装了但从来没被用户启动过,或者是用户自己手动杀死APP进程,则系统不会去主动启动APP中的广播接受者来接受广播。
最新文章
- 使用phpstorm来进行svn提交
- cookie 巩固
- VS2010 OpenCV 2.4.6 配置 (Win7 32位)
- css3 -- 2D变换
- safari的坑
- sql语句将本地服务器中的数据插入到外网服务器中
- 【转载】Powershell连接世纪互联Office365
- DB2 insert into 三种写法
- Android(java)学习笔记199:Android中补间动画(Tween Animation)
- android视图切换动画:ViewAnimator类及其子类
- java中Log4J的使用笔记
- Spark里边:Worker源代码分析和架构
- (转) hadoop 一个Job多个MAP与REDUCE的执行
- Win10关闭某程序的通知的方法
- Linux如何查找处理文件名后包含空格的文件
- 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager
- Maven环境变量
- AltiumDesigner 网络标号放置技巧
- TZOJ 2725 See you~(二维树状数组单点更新区间查询)
- windows快速删除大量文件