安卓實作簡單雙屏異顯
- 參考資料
- 初識Presentation
- 快速上手
- 成品代碼請君品嘗
參考資料
鏈接: Android實作雙屏異顯.
鏈接: Android 6.0:Unable to add window android.view.ViewRootImpl$W@5e2d85a – permission denied.
公司專案后期需要設備支持雙屏異顯,家境貧寒的我表示壓根沒聽過,趕緊碼起來,自己建了一個小demo,
初識Presentation
我發現了Presentation,安卓官方對于Presentation是這樣描述的

大致意思就是,是一種特殊的對話框,是為了在輔助顯示幕上演示內容,
快速上手
想要使用Presentation,首先得找到自己的輔助螢屏,這里我們使用了安卓官方推薦的第二種方式
創建一個activity,然后在里面寫一個內部類繼承于Presentation,當然我只是圖方便,實際上肯定是要新建一個的
private class DifferentDislay extends Presentation {
public DifferentDislay(Context outerContext, Display display) {
super(outerContext, display);
}
public DifferentDislay(Context outerContext, Display display, int theme) {
super(outerContext, display, theme);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//這個地方的布局就是你副屏的布局拉!布局我就不貼了
setContentView(R.layout.diffrentdisplay);
}
}
然后開始簡單快樂的找副屏,找到過后顯示出來
public class MainActivity extends AppCompatActivity {
DisplayManager mDisplayManager;//螢屏管理類
Display[] displays;//螢屏陣列
public static int OVERLAY_PERMISSION_REQ_CODE = 99;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initPresentation();
}
private void initPresentation() {
mDisplayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
displays = mDisplayManager.getDisplays();
DifferentDislay mPresentation = new DifferentDislay(this
, displays[1]);//displays[1]是副屏
mPresentation.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mPresentation.show();
}
然后就開始血淚填坑史,運行過后果斷的閃退了,一看報錯,哦,沒有加權限嘛,小事,在AndroidManifest.xml中加上權限
<!-- 顯示系統視窗權限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
ok,再次運行,果斷又閃退,等等,我的設備是安卓7.0的,要動態申請,那就申請一個唄,可是我發現我的動態申請權限代碼不起作用,最后發現這個權限要跳到單獨的頁面申請,完全代碼如下:
成品代碼請君品嘗
public class MainActivity extends AppCompatActivity {
DisplayManager mDisplayManager;//螢屏管理類
Display[] displays;//螢屏陣列
public static int OVERLAY_PERMISSION_REQ_CODE = 99;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestDrawOverLays();
}
private void initPresentation() {
mDisplayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
displays = mDisplayManager.getDisplays();
DifferentDislay mPresentation = new DifferentDislay(this
, displays[1]);//displays[1]是副屏
mPresentation.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mPresentation.show();
}
private class DifferentDislay extends Presentation {
public DifferentDislay(Context outerContext, Display display) {
super(outerContext, display);
}
public DifferentDislay(Context outerContext, Display display, int theme) {
super(outerContext, display, theme);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diffrentdisplay);
}
}
@TargetApi(Build.VERSION_CODES.M)
public void requestDrawOverLays() {
if (!Settings.canDrawOverlays(MainActivity.this)) {
Toast.makeText(this, "您還沒有打開懸浮窗權限", Toast.LENGTH_SHORT).show();
//跳轉到相應軟體的設定頁面
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + MainActivity.this.getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
} else {
// 授權成功之后執行的方法
initPresentation();
}
}
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(this, "授權失敗", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "授權成功", Toast.LENGTH_SHORT).show();
initPresentation();
}
}
}
}
這樣,一個簡單的雙屏異顯demo就完成啦,共勉,別忘記加權限哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332125.html
標籤:其他
上一篇:Xcode中代碼注釋撰寫小技巧
