Android实训案例六.docx
《Android实训案例六.docx》由会员分享,可在线阅读,更多相关《Android实训案例六.docx(14页珍藏版)》请在冰豆网上搜索。
![Android实训案例六.docx](https://file1.bdocx.com/fileroot1/2023-5/22/7439505d-2a2a-4af6-ad16-b9ad1244e3f0/7439505d-2a2a-4af6-ad16-b9ad1244e3f01.gif)
Android实训案例六
Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
1.IP拨号器
我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,其逻辑就是入门使用广播的一个小案例,那我们新建一个IPCall项目
我们拨打电话的时候系统发一个广播,我们接受到这个广播拿到号码修改之后再放回去,就达到了我们IP拨号的目的,我们需要新建一个Receiver
CallReceiver
packagecom.lgl.ipcall;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.util.Log;
/**
*电话广播
*Createdbylglon16/4/10.
*/
publicclassCallReceiverextendsBroadcastReceiver{
//接收到广播时调用
@Override
publicvoidonReceive(Contextcontext,Intentintent){
Log.i("CallReceiver","打电话");
}
}
这个类暂时不需要做什么。
最重要的还是注册,作为四大组建,他是需要在清单文件里注册的
--注册广播-->
name=".CallReceiver">
--定义接收的广播-->
name="android.intent.action.NEW_OUTGOING_CALL"/>
别忘了,你监听了用户的隐私,是需要权限的
name="android.permission.PROCESS_OUTGOING_CALLS"/>
我们先运行一下,打个电话
好的,广播我们已经抓住了,那我们可以首先获取打出去的号码
Stringiphone=getResultData();
Log.i("CallReceiver","电话号码:
"+iphone);
这样我们就可以拿到String类型的电话号码了
我们现在可以修改号码重新设置IP段了
//添加IP段
StringnewPhone="+86"+iphone;
//把修改后的号码放回去
setResultData(newPhone);
这样我们每次打电话他都会自动帮我们添加一个字段了
完整代码
packagecom.lgl.ipcall;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.util.Log;
/**
*电话广播
*Createdbylglon16/4/10.
*/
publicclassCallReceiverextendsBroadcastReceiver{
//接收到广播时调用
@Override
publicvoidonReceive(Contextcontext,Intentintent){
Log.i("CallReceiver","打电话");
Stringiphone=getResultData();
Log.i("CallReceiver","电话号码:
"+iphone);
//添加IP段
StringnewPhone="+86"+iphone;
//把修改后的号码放回去
setResultData(newPhone);
}
}
2.短信拦截器
系统受到了一条短信后,也是会发一条广播的,所有我们可以在中间写一个广播接受者去进行我们的操作,这里,我们继续在IP拨号器这个项目中写吧,就不新建项目了,不然等下上传也麻烦
我们新建一个Class——SMSReceiver,重写他的onReceive方法,然后我们先注册
--注册广播-->
name=".SMSReceiver">
--定义接收的广播,被Google隐藏的权限操作-->
name="android.provider.Telephony.SMS_RECEIVED"/>
切記,权限
name="android.permission.RECEIVE_SMS"/>
SMSReceiver
packagecom.lgl.ipcall;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.telephony.SmsMessage;
importandroid.util.Log;
/**
*短信拦截器
*Createdbylglon16/4/10.
*/
publicclassSMSReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
System.out.println("收到短信");
//获取短信内容
Bundlebundle=intent.getExtras();
//返回的是一个Object数组
Object[]objects=(Object[])bundle.get("pdus");
//遍历数组得到短信内容
for(Objectobject:
objects){
//把数组元素转换成短信对象
SmsMessagesms=SmsMessage.createFromPdu((byte[])object);
//获取发件人号码
StringtoPhone=sms.getOriginatingAddress();
//获取短信内容
StringsmsContent=sms.getMessageBody();
Log.i("SMSReceiver","发件人号码:
"+toPhone+"短信内容"+smsContent);
//判断是否是拦截的号码
if(toPhone.equals("12345678910")){
//拦截广播
abortBroadcast();
}
}
}
}
这样我们运行之下,你会发现,虽然走到拦截这一步,但是并没有阻止显示在短信收件箱里,这里,我们要注意一个优势,就是广播接收者是有优先级定义的,我们只需要在清单注册根节点的intent-filter标签里定义一个
android:
priority="1000"
官方文档是说数值在-1000到1000之间,但是最高支持int的最大值的权限,int最大值是多少?
自己去看API
3.监听SD卡
我们在对SD卡进行读写的时候会用到,其实也就是巩固一下对广播的使用,做那种语音助手之类的辅助软件,广播和服务还是很有用的,我们还是定义一个SDReceiver并且在清单文件注册
--注册广播-->
name=".SDReceiver">
--SD卡就绪广播-->
name="android.intent.action.MEDIA_MOUNTED"/>
--SD卡拔出广播-->
name="android.intent.action.MEDIA_REMOVED"/>
--SD卡卸载广播-->
name="android.intent.action.MEDIA_UNMOUNTABLE"/>
scheme="file"/>
我们现在可以监听了
SDReceiver
packagecom.lgl.ipcall;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.util.Log;
/**
*监听SD卡
*Createdbylglon16/4/10.
*/
publicclassSDReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//判断广播
Stringaction=intent.getAction();
if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){
Log.i("SDReceiver","SD卡就绪");
}elseif(action.equals(Intent.ACTION_MEDIA_REMOVED)){
Log.i("SDReceiver","SD卡拔出");
}elseif(action.equals(Intent.ACTION_MEDIA_UNMOUNTABLE)){
Log.i("SDReceiver","SD卡卸载");
}
}
}
4.流氓软件
我们监听到开机就启动这个软件,而且不让其退出,达到流氓的效果
先不让他退出,我们在MainActivity中
@Override
publicvoidonBackPressed(){
//禁止返回键
//super.onBackPressed();
}
只要你一安装,就退出不了了,我们再设置一下开机启动,写一个监听器动的广播罢了,我们新建一个RebootReceiver,先注册吧
--注册广播-->
name=".RebootReceiver">
--定义接收的广播-->
name="android.intent.action.BOOT_COMPLETED"/>
这个也是需要权限的
name="android.permission.RECEIVE_BOOT_COMPLETED"/>
RebootReceiver
packagecom.lgl.ipcall;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.util.Log;
/**
*开机启动
*Createdbylglon16/4/10.
*/
publicclassRebootReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
Log.i("RebootReceiver","开机");
//启动
Intenti=newIntent(context,MainActivity.class);
//在Activity之外启动需要设置Flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
5.应用安装卸载监听
我们如果做手机助手或者应用的时候或许可以用得上这玩意,新建一个APPReceiver,然后去注册
--注册广播-->
name=".APPReceiver">
--安装应用-->
name="android.intent.action.PACKAGE_ADDED"/>
--更新应用-->
name="android.intent.action.PACKAGE_REPLACED"/>
--卸载应用-->
name="android.intent.action.PACKAGE_REMOVED"/>
--携带包名-->
scheme="package"/>
然后我们来判断
packagecom.lgl.ipcall;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
import.Uri;
importandroid.util.Log;
/**
*Createdbylglon16/4/10.
*/
publicclassAPPReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//判断广播类型
Stringaction=intent.getAction();
//获取包名
UriappName=intent.getData();
if(Intent.ACTION_PACKAGE_ADDED.equals(action)){
Log.i("APPReceiver","安装"+appName);
}elseif(Intent.ACTION_PACKAGE_REPLACED.equals(action)){
Log.i("APPReceiver","更新"+appName);
}elseif(Intent.ACTION_PACKAGE_REMOVED.equals(action)){
Log.i("APPReceiver","卸载"+appName);
}
}
}
这样我们完全就可以监听状态了,我们以下载一个豌豆荚为例
6.自定义广播
这里,我们有特定需求的时候会用,我们先定义一个Button