Android WindowManager悬浮窗:不需要申请权限实现悬浮
附录文章1介绍了Android平台上的悬浮窗WindowManager,WindowManager悬浮窗可以悬浮在Android设备上的桌面窗口之上,但是WindowManager的使用,必须先申请权限,在一些定制的Android操作系统中,有可能会将WindowManager悬浮窗的权限一律屏蔽掉,这就导致基于WindowManager的APP功能难以实现。
然而,可以变通的通过设置WindowManager的类型,通过设置WindowManager的类型为WindowManager.LayoutParams.TYPE_TOAST,从而不需要申请WindowManager悬浮窗权限就可以使用WindowManager。
写一个例子。一个简单的不需要任何布局的main activity:
package zhangphil.demo; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); TextView textView = new TextView(this); textView.setGravity(Gravity.CENTER); textView.setBackgroundColor(Color.BLACK); textView.setText("zhang phil @ csdn"); textView.setTextSize(10); textView.setTextColor(Color.RED); //类型是TYPE_TOAST,像一个普通的Android Toast一样。这样就不需要申请悬浮窗权限了。 WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_TOAST); //初始化后不首先获得窗口焦点。不妨碍设备上其他部件的点击、触摸事件。 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = 300; //params.gravity=Gravity.BOTTOM; textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplication(), "不需要权限的悬浮窗实现", Toast.LENGTH_LONG).show(); } }); WindowManager windowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE); windowManager.addView(textView, params); } }
代码运行结果:
通过这样的策略实现WindowManager,可以做很多事情,比如Android常见的音乐类APP的底部播放条,可以考虑使用这种手段实现。通过WindowManager做一个音乐播放条放在APP的顶部长期驻留。