纯Android悬浮窗仓库地址:https://github.com/ZhaoKaiQiang/FloatWindow
我想用Qt实现类似的功能跑在android设备上。因此做了以下工作。
效果图:
1.移植原来的代码到Qt for android工程下。
2.在Qt for android下配置服务
<manifest>
.......
<application>
.......
<service android:name="sc.floatwindow.FloatWindowService">
<meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
</service>
</application>
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>
3.Qt C++中动态申请权限:
bool checkPermission3() {
QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.permission.SYSTEM_ALERT_WINDOW");
if(r == QtAndroid::PermissionResult::Denied) {
QtAndroid::requestPermissionsSync( QStringList() << "android.permission.SYSTEM_ALERT_WINDOW" );
r = QtAndroid::checkPermission("android.permission.SYSTEM_ALERT_WINDOW");
if(r == QtAndroid::PermissionResult::Denied) {
return false;
}
}
return true;
}
4.在java中也需要动态申请
//获取悬浮窗 权限
private static final int REQUEST_OVERLAY = 4444;
private void requestOverlayPermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.canDrawOverlays(MainActivity.this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_OVERLAY);
} else {
}
}
}
5.创建悬浮窗类型选择
// 设置显示类型为phone
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){//6.0+
smallWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
Log.e("TAG","_------------------------------6.0++===============================");
}else {
smallWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
6.手机上打开悬浮窗权限。
经过以上折腾,只要编译不出错。运行的时候几乎都可以了。
效果图:
B站视频:https://www.bilibili.com/video/BV1yQ4y197xA/