2015年10月19日星期一

Android四大组件应用系列——实现电话拦截和电话录音 - 杰瑞教育

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Android四大组件应用系列――实现电话拦截和电话录音 - 杰瑞教育  阅读原文»

一、问题描述

  使用BordercastReceiver和Service组件实现下述功能:

1.当手机处于来电状态,启动监听服务,对来电进行监听录音。

2.设置电话黑名单,当来电是黑名单电话,则直接挂断。

  当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理

二、加入AIDL文件

  Android没有对外公开结束通话的API,要结束通话就必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,这样需要android 源码文件NeighboringCellInfo.aidl和ITelephony.aidl添加到项目中,如图所示:

Android Studio 会自动编译产生对应的类文件

三、编写TelReceiver组件
public class TelReceiver extends BroadcastReceiver {
public TelReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {
Intent i
=new Intent(context,ListenPhoneService.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setAction(intent.getAction());
i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER,
intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));
//电话号码
i.putExtra(TelephonyManager.EXTRA_STATE,
intent.getStringExtra(TelephonyManager.EXTRA_STATE));
//电话状态
context.startService(i);//启动服务
}
}

  注册广播:

<receiver android:name=".TelReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
四、编写ListenPhoneService组件
public class ListenPhoneService extends Service {
private AudioManager mAudioManager;
private TelephonyManager tm;
public ListenPhoneService() {
}

@Override
public void onCreate() {
super.onCreate();
mAudioManager
=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
tm
=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去电广播,android没有来电话广播
}else{//去掉拨打电话就是来电状态了
//方法1
//获得来电电话
// String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
//获得电话状态
// String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
// Log.d("jereh", "incoming phone:" + number);
// Log.d("jereh","call state:"+state);
// TelephonyManager.EXTRA_STATE_IDLE: 没有来电 或者 挂断
// TelephonyManagerEXTRA_STATE_OFFHOOK: 接起电话
// TelephonyManager.EXTRA_STATE_RINGING:当电话呼入时,响铃时
// if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
// if(number.equals("13280998858")){//拦截指定的电话号码
// mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
iOS_mapKit与Core Location - 三叶草随风  阅读原文»

目  录:
一、使用MKMap控件
二、根据地址定位
三、在地图上添加锚点
  iOS从3.0版本开始提供了MapKit.frameword支持。该框架提供了一个可被嵌入到应用程序中的地图视图类MKMapView,该地图视图类包含一个可上下、左右滚动的地图视图,而且可以非常方便地在地图中添加定制消息,并可以将其嵌入到应用程序中,通过编程的方式设置地图的各种属性(包含当前地图显示的区域以及用户当前所在位置)。
  iOS从4.0开始,MapKit框架支持可拖动标注和定制覆盖层。可拖动标注允许开发者以编程的方式或用户交互方式来重定位某个标注的位置;覆盖层则可用于创建有多个点组成的复杂标注,这种覆盖层可用于创建公交路线、公园边界或气象信息(如雷达数据)等。
  现在很多的社交软件都引入了地图和定位功能,要想实现这2大功能,那就不得不学习其中的2个框架:MaKit和CoreLocation
  (1)CoreLocation框架可以使用硬件设备来进行定位服务
  (2)MapKit框架能够使应用程序做一些地图展示与交互的相关功能
  iOS定位支持的3中模式:手机基站、WIFI、GPS
一、使用MKMapView控件
  MKMapView控件中位于MapKit.framework中,因此为了在iOS应用中使用该控件,需要完成两件事情:1,为该应用添加MapKit框架;2,在使用MKMapView及相关类的源文件中使用“#import<MapKit/MapKit.h>”导入MapKit.framework的头文件。本章绝大部分示例都使用了MKMapView,因此都需要执行上面两步操作。
  1.指定地图显示中心和显示区域
  为了控制地图显示指定区域,只要两步即可。
  1、创建一个MKCoordinateRegion结构体变量,该结构体变量包含center,span两个成员,其中center控制显示区域的中心,span控制显示区域的范围。
  2、将MKMapView的region属性设为制定的MKCoordinateRegion结构体变量。
  iOS中为开发者提供了以下三种地图类型,开发者可以通过设置MKMapView的mapViewType设置地图类型。
  (1)MKMapTypeStandard 普通地图
  (2)MKMapTypeSatellite 卫星云图
  (3)MKMapTypeHybrid 普通地图覆盖于卫星云图之上
  2.在地图中使用大头针
  (1)通过MapView的addAnnotation方法可以添加一个大头针到地图上
  (2)通过MapView的addAnnotations方法可以添加多个大头针到地图上
    - (void)addAnnotation:(id <MKAnnotation>)annotation;
    说明:需要传入一个遵守了MKAnnotation协议的对象(下面代码中进行演示)
  不但如此还要实现MapView的代理方法
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
static NSString *ID = @"anno";
MKPinAnnotationView
*annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
if (annoView == nil) {
annoView
= [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
// 显示气泡
annoView.canShowCallout = YES;
// 设置绿色
annoView.pinColor = MKPinAnnotationColorGreen;
}

return annoView;
}
  案例:显示指定区域的地图
#import "ViewController.h"
#import
<MapKit/MapKit.h>
#import
"MyAnnotation.h"
@interface ViewController ()
<MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView
*mapView;

@property (weak, nonatomic) IBOutlet UITextField
*latitude;
@property (weak, nonatomic) IBOutlet UITextField
*longitude;

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

//设置地图的显示风格
self.mapView.mapType = MKMapTypeStandard;
//设置地图可缩放
self.mapView.zoomEnabled = YES;
//设置地图可滚动
self.mapView.scrollEnabled = YES;
//设置地图可旋转
self.mapView.rotateEnabled = YES;
//设置显示用户显示位置
self.mapView.showsUserLocation = YES;
//为MKMapView设置delegate
self.mapView.delegate = self;
// [self locateToLatitude:23.12672 longtitude:113.395];
NSLog(@"用户当前是否位于地图中:%d",self.mapView.userLocationVisible);

}
- (IBAction)goClicked:(UIButton *)sender
{
//关闭两个文本框的虚拟键盘
// [self.latitude resignFirstResponder];
// [self.longitude resignFirstResponder];
//经度
NSString *latitudeStr = self.latitude.text;
//纬度
NSString *longtitudeStr = self.longitude.text;
//如果用户输入的经度、纬度为空
if (latitudeStr != nil && latitudeStr.length > 0
&& longtitudeStr!= nil && longtitudeStr.length > 0)
{
//设置经度、纬度
[self locateToLatitude:latitudeStr.floatValue longtitude:longtitudeStr.floatValue];
}
}
-(void)locateToLatitude:(CGFloat)latitude longtitude:(CGFloat)longitude
{
//设置地图中的的经度、纬度
CLLocationCoordinate2D center = {latitude,longitude};
//也可以使用如下方式设置经度、纬度
//center.latitude = latitude;
//center.longitude = longitude;
//设置地图显示的范围
MKCoordinateSpan span;
//地图显示范围越小,细节越清楚;
span

阅读更多内容

没有评论:

发表评论