Android 多窗口显示

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" />

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值