Don't Be negative Don't Be negative - 25 days ago 19
Android Question

How to Give Screen Overlay Permission On My Activity

In My application I am getting Screen Overlay Issue in android 6+
I tried to Turn on But for that I need to Give a Permission for Screen Overlay

I followed this I am unable to Integrate in my activity

I also Tried this seems both are working so I want to Integrate them in my activity

This is my activity :

public class MainActivity extends Activity {

public static final int R_PERM = 123;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.data);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

if ((CheckPermission(this, Manifest.permission.CAMERA)) &&
(CheckPermission(this, Manifest.permission.READ_PHONE_STATE)) &&
(CheckPermission(this, Manifest.permission.NFC))) {
PermHandling();
} else {
RequestPermission(MainActivity.this, Manifest.permission.CAMERA, R_PERM);
RequestPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE, R_PERM);
RequestPermission(MainActivity.this, Manifest.permission.NFC, R_PERM);

//NewPermHandling();
}

}

private void PermHandling() {
//My app internal parts....
//Here my stuff works...
}

//private void NewPermHandling(){

//}

@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {

switch (permsRequestCode) {

case R_PERM: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
PermHandling();
} else {
//Toast.makeText(this, "Please Grant Permissions other wise app will close.!", Toast.LENGTH_SHORT).show();
}
return;
}
}
}

public void RequestPermission(Activity thisActivity, String Permission, int Code) {
if (ContextCompat.checkSelfPermission(thisActivity,
Permission)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Permission)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Permission},
Code);
}
}
}

public boolean CheckPermission(Context context, String Permission) {
if (ContextCompat.checkSelfPermission(context,
Permission) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
return false;
}
}
}


Can any one suggest me how to give Screen orientation permission in my activity
So that User No need to give it or worry about it Please help
Here I tried but I don't know about
PERM_REQUEST_CODE_DRAW_OVERLAYS


Any one Please Help me on my activity this is not duplicate or something else I am asking How to add it in my activity

Answer

Here is a sample code to disable Pull Notification via using custom overlay and its working fine on Version below and 6+. After integrating, let us know if you face any more problems.

Permissions Required in Manifest:

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


     private void disablePullNotificationTouch() {
            try {
                Log.v("App", "Disable Pull Notification");

                    private HUDView mView = new HUDView(this);
                int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);
                Log.v("App", "" + statusBarHeight);

                WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                        WindowManager.LayoutParams.MATCH_PARENT,
                        statusBarHeight,
                        WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Disables status bar
                        PixelFormat.TRANSPARENT); //Transparent

                params.gravity = Gravity.CENTER | Gravity.TOP;
                WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
                wm.addView(mView, params);
            }catch(Exception e){
                Log.v("App","Exception: "+e.getMessage());

            }
        }

    /** code to post/handler request for permission */
        public final static int REQUEST_CODE = -1010101;

        @RequiresApi(api = Build.VERSION_CODES.M)
      public void checkDrawOverlayPermission() {
            Log.v("App","Package Name: "+getApplicationContext().getPackageName());

        /** check if we already  have permission to draw over other apps**/
        if (!Settings.canDrawOverlays(context)) {
            Log.v("App","Requesting Permission"+Settings.canDrawOverlays(context));
            /** if not construct intent to request permission**/
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" +getApplicationContext().getPackageName()));
            /* request permission via start activity for result */
            startActivityForResult(intent, REQUEST_CODE);
         }else{
            Log.v("App","We already have permission for it.");
             disablePullNotificationTouch();
        }
    }
  @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode,  Intent data) {
         Log.v("App","OnActivity Result.");
         //check if received result code
       //  is equal our requested code for draw permission
        if (requestCode == REQUEST_CODE) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.canDrawOverlays(this)) {
                    disablePullNotificationTouch();
                }
            }
        }
    }

Modifying Your Code: Don't forget to use these permissions:

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

public class MainActivity extends Activity {

    public static final int R_PERM = 123;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.data);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Log.v("App","Build Version Greater than or equal to M: "+Build.VERSION_CODES.M);
            checkDrawOverlayPermission();
        }else{
            Log.v("App","OS Version Less than M");
            //No need for Permission as less then M OS.
        }


        if ((CheckPermission(this, Manifest.permission.CAMERA)) &&
                (CheckPermission(this, Manifest.permission.READ_PHONE_STATE)) &&
                (CheckPermission(this, Manifest.permission.NFC))) {
            PermHandling();
        } else {
            RequestPermission(MainActivity.this, Manifest.permission.CAMERA, R_PERM);
            RequestPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE, R_PERM);
            RequestPermission(MainActivity.this, Manifest.permission.NFC, R_PERM);

            //NewPermHandling();
        }

    }

    private void PermHandling() {
        //My app internal parts....
        //Here my stuff works...
    }

    //private void NewPermHandling(){

    //}

    @Override
    public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {

        switch (permsRequestCode) {

            case R_PERM: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    PermHandling();
                } else {
                    //Toast.makeText(this, "Please Grant Permissions other wise app will close.!", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }

    public void RequestPermission(Activity thisActivity, String Permission, int Code) {
        if (ContextCompat.checkSelfPermission(thisActivity,
                Permission)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                    Permission)) {
            } else {
                ActivityCompat.requestPermissions(thisActivity,
                        new String[]{Permission},
                        Code);
            }
        }
    }

     public final static int REQUEST_CODE = -1010101;

        @RequiresApi(api = Build.VERSION_CODES.M)
      public void checkDrawOverlayPermission() {
            Log.v("App","Package Name: "+getApplicationContext().getPackageName());

        /** check if we already  have permission to draw over other apps**/
        if (!Settings.canDrawOverlays(context)) {
            Log.v("App","Requesting Permission"+Settings.canDrawOverlays(context));
            /** if not construct intent to request permission**/
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" +getApplicationContext().getPackageName()));
            /* request permission via start activity for result */
            startActivityForResult(intent, REQUEST_CODE); //It will call onActivityResult Function After you press Yes/No and go Back after giving permission
         }else{
            Log.v("App","We already have permission for it.");
           // disablePullNotificationTouch();
            //Do your stuff, we got permission captain
        }
    }

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode,  Intent data) {
         Log.v("App","OnActivity Result.");
         //check if received result code
       //  is equal our requested code for draw permission
        if (requestCode == REQUEST_CODE) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.canDrawOverlays(this)) {
                    //Permission Granted by Overlay!!!
                    //Do your Stuff
                }
            }
        }
    }

    public boolean CheckPermission(Context context, String Permission) {
        if (ContextCompat.checkSelfPermission(context,
                Permission) == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }
}

startActivityForResult will call onActivityResult if you call this from an activity and not from service. Read more about it here