欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

浅谈Service中实现弹出对话框的坑

程序员文章站 2022-03-25 18:08:02
一、手机版本问题,大多数文章没有涉及这个点,导致他们的代码并无法正常使用 M版本以上需要使用的Type--> TYPE_APPLICATION_OVERLAY AlertDialog.Builder builder=new AlertDialog.Builder(getApplicationCont ......

 

一、手机版本问题,大多数文章没有涉及这个点,导致他们的代码并无法正常使用

m版本以上需要使用的type--> type_application_overlay

alertdialog.builder builder=new alertdialog.builder(getapplicationcontext()); 
builder.settitle("提示");
builder.setmessage("service弹框");
builder.setnegativebutton("明白了",null);
dialog dialog=builder.create();

if (build.version.sdk_int >= build.version_codes.m){//6.0       
dialog.getwindow().settype(windowmanager.layoutparams.type_application_overlay);        
}else {       
dialog.getwindow().settype(windowmanager.layoutparams.type_system_alert);        
}
dialog.show();

同时,因为涉及不同版本的android系统

androidmanifest.xml 中声明同时需要这两个类型对应的权限

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

 

 

二、权限问题,service中弹出的对话框为系统弹框,在m版本以上需要申请悬浮窗权限

android 6.0 以前悬浮窗是默认允许的

注意android 6.0以后的使用

因为悬浮窗权限 system_alert_window 属于特殊权限 ,需要自己特别单独申请

特殊权限,顾名思义,就是一些特别敏感的权限,在android系统中,主要由两个

system_alert_window(设置悬浮窗,进行一些黑科技)
write_settings (修改系统设置)
关于上面两个特殊权限的授权,做法是使用startactivityforresult启动授权界面来完成。

 

申请方式:

private static final int request_code = 1;
private  void requestalertwindowpermission() {
    intent intent = new intent(settings.action_manage_overlay_permission);
    intent.setdata(uri.parse("package:" + getpackagename()));
    startactivityforresult(intent, request_code);
}

@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
    super.onactivityresult(requestcode, resultcode, data);
    if (requestcode == request_code) {
if (build.version.sdk_int >= build.version_codes.m) {
 if (settings.candrawoverlays(this)) {
    log.i("xqxinfo", "onactivityresult granted");
     }
   }
  }
}