Android 系统拨号界面实现自定义悬浮布局
2018-01-26 16:10
676 查看
首先看一下效果图:
1.首先提示是否需要开始个性化拨号界面
2.如果需要,跳转进入设置界面:
3.进入拨打电话界面:
中间的就是自定义显示出来的界面
实现过程:
1.布局:
布局可以由自己的需求实现,怎么写都可以
2.使用WindowManager控制布局:
showFloatView方法用于显示该布局,close按钮用于布局的消失
3.权限申请:
这里有两个地方要用到申请权限。
第一个地方是打开系统界面设置可以在其他应用上显示,第二个地方是拨打电话需要申请权限。
首先需要在清单文件中声明一下:
在代码中:
当需要拨打电话时:对相应按钮的点击事件设置监听:
在图二中弹出dialog,点击需要的时候:
else判断用于开启跳转去系统设置界面
如果点击不需要直接去拨号界面就好了
另外之前不是申请了拨打电话权限嘛,在申请权限回调的方法里:
需要完整代码可以留言跟我说。
1.首先提示是否需要开始个性化拨号界面
2.如果需要,跳转进入设置界面:
3.进入拨打电话界面:
中间的就是自定义显示出来的界面
实现过程:
1.布局:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.androi 4000 d.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="340dp" android:layout_height="184dp" android:background="@color/colorWhite"> <RelativeLayout android:id="@+id/rl_phone_head" android:layout_width="match_parent" android:layout_height="92dp"> <ImageView android:id="@+id/iv_close" android:layout_width="20dp" android:layout_height="20dp" android:layout_alignParentEnd="true" android:layout_marginEnd="12dp" android:layout_marginTop="12dp" android:src="@mipmap/close" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageView android:id="@+id/iv_user" android:layout_width="60dp" android:layout_height="60dp" android:layout_alignParentStart="true" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:background="@drawable/phone_user_bg" android:src="@mipmap/xxx1" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tv_username" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@+id/iv_user" android:layout_marginStart="16dp" android:layout_marginTop="36dp" android:text="用户名" android:textSize="16sp" android:textColor="@color/colorText" android:textStyle="bold" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="92dp" android:background="@color/colorOrangeRed" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/rl_phone_head" > <TextView android:id="@+id/tv_department" android:text="所属部门" android:textSize="16sp" android:textColor="@color/colorWhite" android:layout_margin="16dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_school" android:text="学校" android:textSize="16sp" android:textColor="@color/colorWhite" android:layout_alignParentBottom="true" android:layout_marginBottom="16dp" android:layout_marginStart="16dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> </android.support.constraint.ConstraintLayout>
布局可以由自己的需求实现,怎么写都可以
2.使用WindowManager控制布局:
public void showFloatView() { final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); final View inflate = LayoutInflater.from(getApplicationContext()).inflate(R.layout.window_over_flow, null); final ImageView close = (ImageView) inflate.findViewById(R.id.iv_close); final WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_PHONE; params.format = PixelFormat.RGBA_8888; params.gravity = Gravity.CENTER; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; //这边控制悬浮框的大小 params.height = SizeUtils.dp2px(184); params.width = SizeUtils.dp2px(340); params.x = 0; params.y = 0; close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { windowManager.removeViewImmediate(inflate); } }); windowManager.addView(inflate, params); }
showFloatView方法用于显示该布局,close按钮用于布局的消失
3.权限申请:
这里有两个地方要用到申请权限。
第一个地方是打开系统界面设置可以在其他应用上显示,第二个地方是拨打电话需要申请权限。
首先需要在清单文件中声明一下:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.CALL_PHONE"/>
在代码中:
当需要拨打电话时:对相应按钮的点击事件设置监听:
if (Build.VERSION.SDK_INT >= 23) { if (ActivityCompat.shouldShowRequestPermissionRationale(CallPhoneActivity.this, Manifest.permission.CALL_PHONE)) { // 如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true. // 如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false. // 如果设备策略禁止应用拥有这条权限, 这个方法也返回false. // 弹窗需要解释为何需要该权限,再次请求授权 Toast.makeText(CallPhoneActivity.this, "请授权!", Toast.LENGTH_LONG).show(); // 帮跳转到该应用的设置界面,让用户手动授权 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package",getPackageName(), null); intent.setData(uri); startActivity(intent); } else { // 不需要解释为何需要该权限,直接请求授权 EasyPermissions.requestPermissions(CallPhoneActivity.this, "需要拨打电话权限", 1, Manifest.permission.CALL_PHONE); } } else { showFloatView(); CallPhone(); }
在图二中弹出dialog,点击需要的时候:
if (Build.VERSION.SDK_INT >= 23) { if (Settings.canDrawOverlays(getApplicationContext())) { showFloatView(); CallPhone(); } else { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(intent); } }
else判断用于开启跳转去系统设置界面
如果点击不需要直接去拨号界面就好了
另外之前不是申请了拨打电话权限嘛,在申请权限回调的方法里:
if (Settings.canDrawOverlays(getApplicationContext())) { showFloatView(); CallPhone(); } else { showSaveDialog(); }
需要完整代码可以留言跟我说。
相关文章推荐
- Android客户端之“微服私访”App的系统学习(七)XRecyclerView快速实现列表界面+自定义Search输入框,软键盘搜索按钮监听+TextView部分样式改变
- android 自定义发彩信实现(不调用系统发彩信界面)
- android自定义发彩信实现(不调用系统发彩信界面)
- android 自定义发彩信实现(不调用系统发彩信界面)
- android 自定义发彩信实现(不调用系统发彩信界面)
- android自定义发彩信实现(不调用系统发彩信界面)
- Android Toast优化--通过自定义布局实现界面美化
- Android进阶——自定义View之继承系统控件实现自带删除按钮动画效果和软键盘自动悬浮于文本框下方
- android之自定义ViewGroup和自动换行的布局的实现
- (android控件)界面布局实现GridView(网格效果)
- 自定义拨号界面的实现
- android之自定义ViewGroup和自动换行的布局的实现
- PopupWindow进阶用法——android上实现类似UCweb的自定义menu,完全模拟系统事件
- 重写android.app.ProgressDialog实现自定义进度条弹出框布局
- android下一个典型的设置界面的布局实现 .
- android之自定义ViewGroup和自动换行的布局的实现
- android 实现发送彩信方法 (MMS),非调用系统彩信界面
- Android 调用系统的拨号服务实现 电话拨打功能
- 在Android中,可以自定义类,继承ViewGroup等容器类,以实现自己需要的布局显示。
- android 实现发送彩信方法 (MMS),非调用系统彩信界面