0

I am facing one issue on custom dialog box on API 23, it's crashing.

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();

Crash Report:

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)

Manifest Permission:

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

It's not at all working i am little confuse, please kindly go through my post and suggest me some solution.

Anshuman Pattnaik
  • 143
  • 1
  • 1
  • 7

2 Answers2

0

remove dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); and try with in your app. or if you want to show it on 3rd party app

Sumit
  • 138
  • 1
  • 8
  • Manifest Permission: need when you want to show dialog when you app is in background or app is close – Sumit Aug 10 '16 at 09:48
0

Look at my answer on runtime permissions,

In this answer, you can include your code in access contacts method.

An example of implementing Permissions in any 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
            }
        }
    }
Community
  • 1
  • 1
Mohammed Atif
  • 4,383
  • 7
  • 28
  • 57