浅谈Android平台短信拦截的几种实现方式(包括NDK注册短信监听器)
2014-11-16 16:30
567 查看
移动端安全形势日益严峻。特别是在android平台,很多恶意软件在后台悄无声息的向运营商发送订阅服务短信,窃取用户资费。他们都对用户接收到的短信进行了拦截。下面是我总结的4中常用拦截方式。
Android短信拦截,总的来说可以分成两大类:
1. 监听短信数据库的变化
在代码中,实现注册短信监听类,监听短信数据库的变换,把指定号码或指定内容的短信屏蔽掉,这种方式是一种“假”方式,其实是在收件箱收到短信之后,再删除指定的短信。
1).申请短信读写权限
2).注册短信内容观察回调类:
3).实现回调类:
2. 注册短信广播监听器
注册短信广播监听器方式又分为静态注册和动态注册。动态注册又可以细分为Java层注册和Native层注册。
(1). 静态注册:
1)权限声明:在AndroidManifest.xml中声明权限:
2)设置接收短信广播的Receiver及其优先级:
3)实现Receiver
(2). 动态注册—Java层:
1)权限声明:在AndroidManifest.xml中声明权限:
2)实现Receiver
3)动态注册Receiver:
(3). 动态注册—native层:
1.权限声明:在AndroidManifest.xml中声明权限:
2.实现Receiver响应类:
3). Native层注册Receiver:
Native实现短信拦截Demo:http://download.csdn.net/detail/hookfeng/8164315
以上是我已知的短信拦截方式,如还有其它实现方式,请赐教,谢谢。
以上提到的技术仅限技术交流使用。
Android短信拦截,总的来说可以分成两大类:
1. 监听短信数据库的变化
在代码中,实现注册短信监听类,监听短信数据库的变换,把指定号码或指定内容的短信屏蔽掉,这种方式是一种“假”方式,其实是在收件箱收到短信之后,再删除指定的短信。
1).申请短信读写权限
<uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/>
2).注册短信内容观察回调类:
SmsContent content = new SmsContent(new Handler()); this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);
3).实现回调类:
public class SmsContent extends ContentObserver{ public void onChange(boolean selfChange) { // TODO Auto-generated method stub super.onChange(selfChange); Log.i("contentmessage", "onChange!"); // 在这里你可以对短信数据库进行任意操作 }
2. 注册短信广播监听器
注册短信广播监听器方式又分为静态注册和动态注册。动态注册又可以细分为Java层注册和Native层注册。
(1). 静态注册:
1)权限声明:在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
2)设置接收短信广播的Receiver及其优先级:
<receiver android:name = "com.example.messagetest.SmsReceiver"> <intent-filter android:priority="2324324234"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
3)实现Receiver
public class SmsReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub //在这里可以对接收到的短信进行想要的处理 } }
(2). 动态注册—Java层:
1)权限声明:在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
2)实现Receiver
public class SmsReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub //在这里可以对接收到的短信进行想要的处理 } }
3)动态注册Receiver:
IntentFilter iFilter = null; mReceiver = new Receiver(); iFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); iFilter.setPriority(Integer.MAX_VALUE); registerReceiver(mReceiver, iFilter);
(3). 动态注册—native层:
1.权限声明:在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
2.实现Receiver响应类:
public class Receiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub //在这里可以对接收到的短信进行想要的处理 } }
3). Native层注册Receiver:
/*生成一般实例对象*/ jobject getInstance(JNIEnv* env, jclass obj_class) { jmethodID construction_id = (*env) -> GetMethodID(env, obj_class, "<init>", "()V"); jobject obj = (*env) -> NewObject(env, obj_class, construction_id); return obj; } /*生成IntentFilter实例对象*/ jobject getIntentFilterInstance(JNIEnv* env, jclass obj_class, jstring stringparam) { jmethodID construction_id = (*env) -> GetMethodID(env, obj_class, "<init>", " (Ljava/lang/String;)V"); jobject obj = (*env) -> NewObject(env, obj_class, construction_id, stringparam); return obj; } /*动态注册实现函数,注意加粗部分*/ JNIEXPORT void JNICALL Java_com_example_nativeregistermessage_MainActivity_RegisterReceiver (JNIEnv *env, jobject obj) { /*生成IntentFilter对象*/ j 4000 class intentfilter = (*env) -> FindClass(env, "android/content/IntentFilter"); if (0 == intentfilter) return; char* tempchar = "android.provider.Telephony.SMS_RECEIVED"; jobject intentfilter_obj = getIntentFilterInstance(env, intentfilter, (*env) -> NewStringUTF(env, tempchar)); if (0 == intentfilter_obj) return; /*调用IntentFilter的setPriority函数来设置Receiver的优先级*/ jmethodID mintentfilter = (*env) -> GetMethodID(env, intentfilter, "setPriority","(I)V");// if (0 == mintentfilter) return; (*env) -> CallVoidMethod(env, intentfilter_obj, mintentfilter, (jint)1000); /*生成短信广播监听器的回调对象*/ jclass receiverclass = (*env) -> FindClass(env, "com/example/nativeregistermessage/Receiver"); jobject receiver_obj = getInstance(env, receiverclass); /*调用当前context中的registerreceiver来注册短信广播监听器*/ jclass registerreceiver = (*env) -> FindClass(env, "android/content/ContextWrapper"); jmethodID mregisterreceiver = (*env) -> GetMethodID(env, registerreceiver, "registerReceiver"," (Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;) Landroid/content/Intent;"); if (0 == mregisterreceiver) return; (*env) -> CallObjectMethod(env, obj, mregisterreceiver, receiver_obj, intentfilter_obj); }
Native实现短信拦截Demo:http://download.csdn.net/detail/hookfeng/8164315
以上是我已知的短信拦截方式,如还有其它实现方式,请赐教,谢谢。
以上提到的技术仅限技术交流使用。
相关文章推荐
- 浅谈Android平台短信拦截的几种实现方式
- 【Android-View】浅谈Android换肤的几种实现方式
- Android 来电(包括铃声),短信拦截的实现方法
- android手机短信拦截的实现
- android手机短信拦截的实现
- 本文介绍在Android平台中实现对XML的三种解析方式。
- android手机短信拦截的实现【精华转载】
- Android 注册广播有几种方式及优缺点
- Android - 批量发送短信的实现方式
- Android平台中实现对XML的三种解析方式(DOM 、PULL、 SAX)
- android中Button监听器的几种实现方式
- 在Android平台中实现对XML的三种解析方式。
- Android 定时器实现的几种方式和removeCallbacks失效问题详解
- Android之ImageView的加边框颜色的几种实现方式
- android82--注册广播有几种方式
- 【Android入门】注册监听器的几种方式
- 在通过android的广播机制拦截短信的实现过程中遇到的问题
- 在Android上实现多格式多媒体播放器的几种方式
- android 获取手机自定位的几种实现方式
- Android JNI和NDK学习(02)--静态方式实现JNI