【问题标题】:Why custom dialog is not working on API 23?为什么自定义对话框不适用于 API 23?
【发布时间】:2016-08-10 09:33:27
【问题描述】:

我在 API 23 的自定义对话框中遇到了一个问题,它崩溃了。

final Dialog dialog = new Dialog(getActivity());
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.progress_dialog);
dialog.setCancelable(false);
dialog.show();

崩溃报告:

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@3387043 -- permission denied for this window type
at android.view.ViewRootImpl.setView(ViewRootImpl.java:598)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:86)
at android.app.Dialog.show(Dialog.java:319)
at com.example.hello.fragment.ExploreFragment.exploreBeers(ExploreFragment.java:255)
at com.example.hello.fragment.ExploreFragment$4.onEditorAction(ExploreFragment.java:203)
at android.widget.TextView.onEditorAction(TextView.java:4773)
at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:139)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:304)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

清单权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

这根本不起作用我有点困惑,请仔细阅读我的帖子并建议我一些解决方案。

【问题讨论】:

  • 此窗口类型的权限被拒绝。您需要在启动该功能之前询问运行时权限。
  • 嘿谢谢你能告诉我怎么做吗??
  • 使用 LayoutParams.TYPE_TOAST 或 TYPE_APPLICATION_PANEL
  • 你可以看看我下面关于如何在 Lolipop 及以上实现运行时权限的回答

标签: android dialog android-windowmanager


【解决方案1】:

删除 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 并在您的应用中尝试。 或者如果你想在 3rd 方应用上显示它

【讨论】:

  • Manifest Permission: 当您想在应用处于后台或应用关闭时显示对话框时需要
【解决方案2】:

看看我的answer on runtime permissions

在这个答案中,您可以在访问联系人方法中包含您的代码。

在任何 Activity 中实现权限的示例。

SampleActivity.java

    public class SampleActivity extends AppCompatActivity{
        private final int PERMISSION_CODE = 1;
        Button button;
        @override
        onCreate(Bundle savedInstance){
            super.onCreate(savedInstance);
            setContentView(R.layout.your_layout);
            button = (Button)findViewById(R.id.button);
            button.setOnClickListener(new OnClickListener(){
                @override
                public void onClick(View view){
                    requestPermissionAndContinue();
                }
            });
            //remaining code to continue using the app
            //your actual code should also be in this same class
        }

        private void requestPermissionAndContinue(){
            if(ContextCompat.checkSelfPermission(this, Manifest.permission.SYSTEM_ALERT_WINDOW) != PackageManager.PERMISSION_GRANTED){
                if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SYSTEM_ALERT_WINDOW)){
                    Log.e(TAG, "permission denied, show dialog");
                }else{
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SYSTEM_ALERT_WINDOW}, PERMISSION_CODE);
                }
            }else{
                showAlert();
            }
        }

        private void showAlert(){
            //your code to show alert dialog
            final Dialog dialog = new Dialog(getActivity());
  dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.progress_dialog);
dialog.setCancelable(false);
dialog.show();
        }

        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if(grantResults.length > 0 && permissions[0]==PackageManager.PERMISSION_GRANTED){
                showAlert();
            }else{
                 //redirect to settings page or ask permission again
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多