Launcher中獲取副屏分辨率、密度

目的是要在launcher的副屏顯示廣告,所以第一是要控制副屏,第二是要適配.因為主屏幕和副屏幕尺寸、密度都不一樣所以必須獲取副屏信息

獲取到副屏

我使用了控制媒體通道獲取屏幕信息

MediaRouter允許應用程序控制媒體通道和流從當前設備到外部揚聲器和目標設備的路由

要注意的是MediaRouter的API不是線程安全的;與它的所有交互都必須在流程的主線程中完成

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            MediaRouter mediaRouter = MediaRouter.getInstance(this);
            List<MediaRouter.RouteInfo> routes = mediaRouter.getRoutes();
            Display display = null;
            for (MediaRouter.RouteInfo routeInfo : routes) {
           //我的設備只有一個副屏
                if (routeInfo.getPresentationDisplay() != null) {
                  //display就是我要拿到的副屏信息
                    display = routeInfo.getPresentationDisplay();
                    break;
                }
            }

            if (display != null) {
                presentation = new MainPresentation(this, display);
              //控制顯示副屏
                presentation.show();
            }
        }
斷點看看獲取的信息

Presentation顯示

Presentation是一種特殊的dialog(繼承自Dialog),用于副屏顯示控制

使用例子:

DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
 Display[] presentationDisplays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
  if (presentationDisplays.length > 0) {
      // If there is more than one suitable presentation display, then we could consider
    // giving the user a choice.  For this example, we simply choose the first display
     // which is the one the system recommends as the preferred presentation display.
    Display display = presentationDisplays[0];
    Presentation presentation = new MyPresentation(context, presentationDisplay);
   presentation.show();

代碼獲取屏幕分辨率,密度
屏幕密度:為每英寸像素點數


/**
 * 屏幕管理類
 */
@SuppressLint({"NewApi"})
public class MainPresentation extends Presentation {
    private static final String TAG = "MainPresentation";
    private Context mContext;
    private Display mParamDisplay;

    public MainPresentation(Context paramContext, Display paramDisplay) {
        super(paramContext, paramDisplay);
        mContext = paramContext;
        mParamDisplay = paramDisplay;

    }

    @Override
    protected void onCreate(Bundle paramBundle) {
        super.onCreate(paramBundle);
        setContentView(R.layout.main_presentation);
        //獲取Height  Width
        if (mParamDisplay != null) {
            int physicalHeight = mParamDisplay.getMode().getPhysicalHeight();
            int physicalWidth = mParamDisplay.getMode().getPhysicalWidth();
        }

        //獲取屏幕密度
        DisplayMetrics displayMetrics = new DisplayMetrics();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            mParamDisplay.getRealMetrics(displayMetrics);
        } else {
            mParamDisplay.getMetrics(displayMetrics);
        }
        String density = String.valueOf(displayMetrics.densityDpi);
        Log.e(TAG, "onCreate density: " + density);
    }


}

如何知道獲取的是否正確,可以dump屏幕信息進行對比

adb shell dumpsys display

Display 1為副屏
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容