android来电归属地提醒(安卓来电显示归属地)

时间:2022-10-13 12:17:04来源:网络整理
导读android来电归属地提醒现在市面上常用的一些拨号软件的一个功能,来电归属地。拨号的时候,会在拨号界面出现一个号码归属地的小框框。归属地查询,其实就是自定义一

android来电归属地提醒现在市场上常用的一些拨号软件的功能,来电归属地。拨号时,拨号界面会出现一个号码所属的小方框。效果如下:而且这个小表格还可以自定义样式,自由移动。以下是实施过程的概述。这个小框架实际上是一个定制的吐司。Toast 是显示在所有表单之上的特殊表单。归属地查询其实就是自定义一个toast,然后注册一个服务,在后台监控铃声状态安卓来电显示归属地,在铃声响起的时候显示toast,就达到了归属地的效果。我们知道toast的默认界面是一个黑色的小边框,那么如何才能让这个自定义的透明toast带有图标呢?我们先看一下toast的源码。Toast 中最重要的方法之一是 MakeText 方法。其源代码如下: [java]viewplaincopyprint? 查看派生自我的代码切片的 CODE 上的代码切片 publicstaticToastmakeText(Contextcontext,CharSequencetext,intduration)ToastresultnewToast(context);LayoutInflaterinflate(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);Viewinflate. inflate(com.android.internal.R.layout.transient_notification,null);TextViewtv(TextView)v.findViewById(com.android.internal.R.id.message);tv.setText(text);result.mNextViewduration;returnresult ;可以看到toast的界面视图来自于布局文件transient_notificationinflate,也就是说toast的界面是在transient_notification中定义的。[java]viewplaincopyprint? 查看派生自我的代码切片的 CODE 上的代码切片 publicstaticToastmakeText(Contextcontext,CharSequencetext,intduration)ToastresultnewToast(context);LayoutInflaterinflate(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);Viewinflate. inflate(com.android.internal.R.layout.transient_notification,null);TextViewtv(TextView)v.findViewById(com.android.internal.R.id.message);tv.setText(text);result.mNextViewduration;returnresult ;可以看到toast的界面视图来自于布局文件transient_notificationinflate,也就是说toast的界面是在transient_notification中定义的。[java]viewplaincopyprint? 查看派生自我的代码切片的 CODE 上的代码切片 publicstaticToastmakeText(Contextcontext,CharSequencetext,intduration)ToastresultnewToast(context);LayoutInflaterinflate(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);Viewinflate. inflate(com.android.internal.R.layout.transient_notification,null);TextViewtv(TextView)v.findViewById(com.android.internal.R.id.message);tv.setText(text);result.mNextViewduration;returnresult ;可以看到toast的界面视图来自于布局文件transient_notificationinflate,也就是说toast的界面是在transient_notification中定义的。LayoutInflaterinflate(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);查看inflate。inflate(com.android.internal.R.layout.transient_notification,null);TextViewtv(TextView)v.findViewById(com.android.internal.R.id.message);tv.setText(text);result.mNextViewduration;returnresult ;可以看到toast的界面视图来自于布局文件transient_notificationinflate,也就是说toast的界面是在transient_notification中定义的。LayoutInflaterinflate(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);查看inflate。inflate(com.android.internal.R.layout.transient_notification,null);TextViewtv(TextView)v.findViewById(com.android.internal.R.id.message);tv.setText(text);result.mNextViewduration;returnresult ;可以看到toast的界面视图来自于布局文件transient_notificationinflate,也就是说toast的界面是在transient_notification中定义的。

我们看一下transient_notification的源码。[java]viewplaincopyprint? 在我的代码切片导出的CODE上查看代码切片可以看到toast的一些参数,比如背景图片、字体颜色、宽度等,这里可以通过改变一些参数来改变toast的样式。自定义一些我们最喜欢的样式。吐司如何在屏幕上显示?源码中有这么一段代码。[java]viewplaincopyprint? 查看派生到我的代码段的代码片段 mWM(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);finalintgravityGravity.getAbsoluteGravity(mGravity,config.getLayoutDirection());mParams.gravityGravity.VERTICAL_GRAVITY_MASK)mX ;mParams.ymY;mParams.verticalMarginmVerticalMargin; mParams.horizo​​ntalMarginmHorizo​​ntalMargin;mWM.addView(mView,mParams);

这段代码就是在屏幕上显示吐司的内容。其中,mWM是表单管理器,两个参数分别是要显示的视图对象和要在表单上显示的视图对象所需的一些参数。

style="font-size:18px;">我们按照源码来实现自定义来电归属地小窗体的功能。

首先自定义表单的布局文件

[java] viewplaincopyprint? CODE 上的视图代码片派生到我的代码片,然后使用布局文件生成视图对象 [java] view plaincopyprint?CODE 上的视图代码切片源自我的代码切片视图 View.inflate(this, R .layout.activity_toast_address, null); 定义一个窗口管理器[java] 视图plaincopyprint?查看从我的代码片 wm (WindowManager)getSystemService(WINDOW_SERVICE); 派生的 CODE 上的代码片 根据上面toast源码的介绍 给表单添加视图对象,使用addView方法 [java] view plaincopyprint? 查看代码片段 导出到我的片段 TextView tv_toast_address (TextView) view.findViewById(R.id.tv_toast_address); tv_toast_address.setText(text);//文本为传入的归属地址 wm.addView(view, params);//将自定义toast添加到已经存在的表单视图中,

[java] 查看plaincopyprint?查看代码片上 CODE 派生到我的代码片 params newWindowManager.LayoutParams();//新建一个 params 对象 params.gravity Gravity.TOP;params.height WindowManager.LayoutParams.WRAP_CONTENT;params.format PixelFormat.TRANSLUCENT;params.type WindowManager .LayoutParams.TYPE_PRIORITY_PHONE;params.setTitle("Toast"); params.flags WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 按照上面的步骤,定义一个归属表单,但是表单会一直停留在屏幕上,直到调用 removeView 方法。如何使表单仅在来电和去电时显示?在服务中写入以上代码,开机启动服务。

索尼手机没有来电归属儿地_安卓来电显示归属地_苹果5s如何关闭来电归属

但是,这个表单现在将始终显示在所有界面上,因为 toast 是一种特殊的表单,将显示在所有表单的顶部。以下两种情况按呼入呼出分别处理。来电时:[java]查看plaincopyprint?查看 CODE 上的代码片段 派生到我的代码片段 监听铃声事件,如果有铃声 tm (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 监听器 newMyPhonestateListener(); 监听电话状态变化 tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE) private class MyPhonestateListener extends PhoneStateListener @Overridepublic void onCallStateChanged(int state, String incomingNumber) super.onCallStateChanged(state, incomingNumber); 切换(状态)案例 TelephonyManager.CALL_STATE_IDLE:挂断电话时删除 新增小表单 wm.removeView(view); 查看案例 TelephonyManager.CALL_STATE_RINGING: 字符串位置 Toast.makeText(PhoneAddressService.this,location, 1).show();showMyToast(location); 休息; 现在可以在来电响铃时显示归属窗口。

挂断电话时,归属窗口将被移除。当你拨打电话,也就是拨号时,系统会发送广播,接收广播,并在onReceive方法中控制归属表单的显示。接收时在service服务类中创建广播接收器的内部类 拨打广播时显示归属窗口 [java]view plaincopyprint? 查看 CODE 上的代码片 Derived from my code slice 定义广播接收器类 InnerReceiver extends BroadcastReceiver @Overridepublic void onReceive(Context context, Intent intent) Stringnumber getResultData ();String location Toast.makeText(context,location, 1).show (); showMyToast(位置); 然后在 onCreate 方法中注册广播接收器。[java] 查看plaincopyprint?查看派生到我的代码片的 CODE 上的代码片 向代码接收器注册广播接收器 newInnerReceiver(); IntentFilter 过滤器 newIntentFilter("android.intent.action.NEW_OUTGOING_CALL") registerReceiver(rec,filter) ; 按照以上步骤,就完成了来电小窗体的功能。

但是目前这个小表格是不能移动的,只能在上面params定义的位置。要使表单移动,必须处理表单的视图。表格移动的原理其实就是记录手指在屏幕上移动时手指在x轴上移动的距离,同时将home表格移动相应的距离,然后更新实时位置窗体,并初始化手机的位置。最后,要处理表格和边框之间的距离。否则,归属表会移出x轴,不符合实际情况。对表单的坐标做一些逻辑判断安卓来电显示归属地,最终代码如下:[java] vienc630. comwplaincopyprint?查看 CODE 上的代码片 Derived from my code slice 为自定义表单设置触摸监听器 view.setOnTouchListener(new OnTouchListener () privateint startX privateint startY @Overridepublic boolean onTouch(View MotionEventevent) switch(event.getAction()) caseMotionEvent。 ACTION_DOWN:// 手指触摸屏幕时执行的方法 startX (int) event.getRawX(); startY (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE:// 手指移动时执行的方法屏幕计算手指在屏幕上移动的位移 int newX (int) event.getRawX(); int newY (int) event.getRawY(); int dx startX;int dy 移动帧到对应位置 if(params .x(wm.getDefaultDisplay().getWidth()-params.width)){ params.y dx;params.y dy;wm.updateViewLayout(view, params);

此处不作说明。最后,当服务结束时,注销监听器和广播接收器。[java] 查看plaincopyprint?查看派生到我的代码切片的 CODE 上的代码切片 public void onDestroy() super.onDestroy();tm.listen(listener, PhoneStateListener.LISTEN_NONE); 侦听器 null;unregisterReceiver(receiver); 接收者到这里,实现了可移动的来电和去电归属地小表格的功能。渲染:[java] 查看plaincopyprint?查看派生到我的代码片的 CODE 上的代码片

最新文章