淺談Service中實現彈出對話框的坑


 

一、手機版本問題,大多數文章沒有涉及這個點,導致他們的代碼並無法正常使用

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啟動授權界面來完成。

 

判斷權限方式:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                try {
                    dealWindowPermission(); // 沒有權限,進行權限申請處理
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
            }
        } else {
        }

 

申請方式:

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");
     }
   }
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM