import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.ActivityOptions;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.media.MediaRouter;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import com.example.boschnfc.R;
import com.example.boschnfc.activity.activity.ProtocolTestActivity;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;
public class MultiScreenDisplayActivity extends AppCompatActivity {
private DisplayManager displayManager;
private Display currentDisplay;
private Context presentationContext;
private WindowManager presentationWindowManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multi_screen_display);
//开启另一个activity到副屏
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //Android O开始,使用Activity显示客显屏内容
// ActivityOptions options = ActivityOptions.makeBasic();
// MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE);
// MediaRouter.RouteInfo routeInfo = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
// if(routeInfo != null) {
// Display presentationDisplay = routeInfo.getPresentationDisplay();
// options.setLaunchDisplayId(presentationDisplay.getDisplayId());
//
// // 启动客显屏Activity
// Intent intent = new Intent(this, ProtocolTestActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
// startActivity(intent, options.toBundle());
// }
// }
//通过windowManager来操纵副屏 处于同一个activity内
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
//启动Activity让用户授权
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse( "package:$packageName"));
startActivityForResult(intent, 1010);
}
}
initDisplayManager();
initWindowManager();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1010){
if (resultCode == RESULT_OK){
initDisplayManager();
initWindowManager();
}
}
}
private void initDisplayManager(){
displayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
currentDisplay = null;
Display[] displays = displayManager.getDisplays();
if (displays != null){
//0为主屏 ,1为副屏
Display display = displays[1];
if (currentDisplay == null && display != null){
currentDisplay = display;
}
}
}
private void initWindowManager(){
Context displayContext = createDisplayContext(currentDisplay);
WindowManager wm = (WindowManager) displayContext.getSystemService(WINDOW_SERVICE);
presentationContext = new ContextThemeWrapper(displayContext, android.R.style.Theme){
@Override
public Object getSystemService(String name) {
if (WINDOW_SERVICE == name) {
return(wm);
}
return super.getSystemService(name);
}
};
presentationWindowManager = (WindowManager) presentationContext.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater inflater = LayoutInflater.from(presentationContext);
View view = inflater.inflate(R.layout.default1, null);
//最终副屏会显示default.xml的内容
if (presentationWindowManager != null)
presentationWindowManager.addView(view,buildLayoutParams());
}
@SuppressLint("InlinedApi")
private WindowManager.LayoutParams buildLayoutParams(){
if(Build.VERSION.SDK_INT >= 26){
return new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
0,
0,
TYPE_APPLICATION_OVERLAY, //FIRST_SYSTEM_WINDOW + 38
0, PixelFormat.TRANSPARENT
);
} else {
return new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
0,
0,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
0, PixelFormat.TRANSPARENT
);
}
}
}
//在清单文件中添加相关权限
<!-- 需要申请显示在其他应用上层的权限,用于练习多屏显示 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
Android 多窗口显示
于 2023-05-25 14:05:47 首次发布