系统广播权限_拦截短信

当应用程序发出某个广播时,系统会将发送的 Intent 与系统中所有注册的 BroadcastReceiver IntentFilter 进行匹配,若匹配成功则执行相应的 onReceive 方法。如果在发出广播时,使用 sendBroadcast(Intent, Stirng) 方法,则该广播就具有了权限,发送给接受者必须具备相应的权限。

1 @Override
2             public void onClick(View v) {
3                 Intent intent = new Intent("com.freshen.code.Receiver");
4                 intent.putExtra("msg", "拥有权限才能收到本广播。");
5                 sendBroadcast(intent, "com.freshen.code.Receiver.permission");
6                 //sendBroadcast(intent);
7                 Log.i("Tag", "广播已发出。");
8             }}

在 Manifest 文件开启相应的权限。权限风险取值:

1、normal:权限是低风险的,不会对系统、用户或其他应用程序造成危害;

2、dangerous:权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限;

3、signature:只有当应用程序所用数字签名与声明此权限的应用程序所有数字签名相同时,才能将权限授给它;

4、signatureOrSytem:权限授给具有相同数字签名的应用程序或 Android 包类。

1     <!-- 声明权限 -->
2     <permission android:name="com.freshen.code.Receiver.permission"
3         android:protectionLevel="normal"  ></permission>
4     
5     <!-- 声明拥有的权限 -->
6     <uses-permission android:name="com.freshen.code.Receiver.permission"/>

静态注册广播接收器

 1 <!-- 广播接收器 -->
 2         <receiver android:name=".Receiver1" >
 3             <intent-filter>
 4                 <action android:name="com.freshen.code.Receiver" />
 5                 <category android:name="android.intent.category.DEFAULT" />
 6             </intent-filter>
 7         </receiver>
 8         <receiver android:name=".Receiver2"  >
 9             <intent-filter>
10                 <action android:name="com.freshen.code.Receiver" />
11                 <category android:name="android.intent.category.DEFAULT" />
12             </intent-filter>
13         </receiver>

动态注册广播接收器

 1 @Override
 2     protected void onStart() {
 3         super.onStart();
 4         r = new Receiver3();
 5         IntentFilter itf = new IntentFilter("com.freshen.code.Receiver");
 6         // 只接受具有权限的广播
 7         registerReceiver(r, itf, "com.freshen.code.Receiver.permission", null);
 8         Log.i("Tag", "动态注册Receiver3");
 9     }
10     
11     @Override
12     protected void onStop() {
13         super.onStop();
14         if(r != null) unregisterReceiver(r);
15     }

部分系统广播

1、android.provider.Telephony.SMS_RECEIVED;接收到短信时的广播

2、android.intent.action.NEW_OUTGOING_CALL;接收来电广播

3、android.intent.action.BATTERY_CHANGED;接收电池电量变化广播

4、android.intent.action.BOOT_COMPLETED;接收开机广播

5、android.net.conn.CONNECTIVITY_CHANGE;接收网络状态发生变化时的广播

6、android.intent.action.AIRPLANE_MODE;接收飞行模式广播

7、android.intent.action.CAMERA_BUTTON;接收打开照相机广播

8、android.intent.action.DEVICE_STORAGE_LOW;存储空间不足广播

9、android.intent.action.SCREEN_OFF;屏幕关闭广播

10、android.intent.action.SCREEN_ON;屏幕打开广播

11、android.intent.action.PACKAGE_FULLY_REMOVED;移除应用程序广播

 1 @Override
 2     public void onReceive(Context context, Intent intent) {
 3         
 4         Log.i("Tag", "有短信");
 5         //
 6         Object [] pdus = (Object[]) intent.getExtras().get("pdus");
 7         
 8         for(Object o:pdus){
 9             byte [] pdu = (byte[]) o;
10             // 创建短信
11             SmsMessage sms = SmsMessage.createFromPdu(pdu);
12             String content = sms.getMessageBody();
13             Date date = new Date(sms.getTimestampMillis());
14             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
15             String fdate = sdf.format(date);
16             String from = sms.getOriginatingAddress();
17             Log.i("Tag",content+" "+fdate+" [from] "+from);
18         }
19     }

短信发出广播时,内容会存储在 Bundle 对象中以 pdus 为键的对象数组。遍历该数组,将每条短消息转换为字节数组。调用 SmsMessage (短信类)的静态方法创建短信对象。

如果要实现拦截短信功能,检测短信内容,经该广播终止,用户就无法收到该条短信。该接收器需要较高的优先级。

1         <receiver android:name=".SmsReceiver">
2             <intent-filter>
3                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
4                 <category android:name="android.intent.category.DEFAULT" />
5             </intent-filter>
6         </receiver>

添加权限

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

SmsReceiver 接收器

 1 public class SmsReceiver extends BroadcastReceiver {
 2 
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5         
 6         Log.i("Tag", "有短信");
 7         //
 8         Object [] pdus = (Object[]) intent.getExtras().get("pdus");
 9         
10         for(Object o:pdus){
11             
12             byte [] pdu = (byte[]) o;
13             // 创建短信
14             SmsMessage sms = SmsMessage.createFromPdu(pdu);
15             String content = sms.getMessageBody();
16             Date date = new Date(sms.getTimestampMillis());
17             
18             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
19             String fdate = sdf.format(date);
20             String from = sms.getOriginatingAddress();
21             Log.i("Tag", content + " " + fdate + " [from] " + from);
22         }
23     }
24 }

DDMS/Emulator Control 

Incoming number 为来电号码,可以随意输入;Voice 为来电呼叫,SMS 为发送短信,内容是 Message 输入框的文本。

posted @ 2015-05-26 17:06  壬子木  阅读(382)  评论(0)    收藏  举报