How To Give Screen Overlay Permission On My Activity
Solution 1:
Here is a sample code to disable pull notifications by using custom overlay. It works fine on Android versions below and 6+.
Permissions Required in Manifest:
<uses-permissionandroid:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" /><uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW" />
Disabling the pull notifications
privatevoiddisablePullNotificationTouch() {
try {
Log.v("App", "Disable Pull Notification");
privateHUDViewmView=newHUDView(this);
intstatusBarHeight= (int) Math.ceil(25 * getResources().getDisplayMetrics().density);
Log.v("App", "" + statusBarHeight);
WindowManager.LayoutParamsparams=newWindowManager.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;
WindowManagerwm= (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
} catch (Exception e) {
Log.v("App", "Exception: " + e.getMessage());
}
}
// code to post/handler request for permission publicfinalstaticintREQUEST_CODE= -1010101;
@RequiresApi(api = Build.VERSION_CODES.M)publicvoidcheckDrawOverlayPermission() {
Log.v("App", "Package Name: " + getApplicationContext().getPackageName());
// check if we already have permission to draw over other appsif (!Settings.canDrawOverlays(context)) {
Log.v("App", "Requesting Permission" + Settings.canDrawOverlays(context));
// if not construct intent to request permissionIntentintent=newIntent(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)@OverrideprotectedvoidonActivityResult(int requestCode, int resultCode, Intent data) {
Log.v("App", "OnActivity Result.");
//check if received result code// is equal our requested code for draw permissionif (requestCode == REQUEST_CODE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(this)) {
disablePullNotificationTouch();
}
}
}
}
Your code after modifications
publicclassMainActivityextendsActivity {
publicstaticfinalintREQUEST_PERMISSION=123;
@OverridepublicvoidonCreate(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, REQUEST_PERMISSION);
RequestPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION);
RequestPermission(MainActivity.this, Manifest.permission.NFC, REQUEST_PERMISSION);
//NewPermHandling();
}
}
privatevoidPermHandling() {
//My app internal parts....//Here my stuff works...
}
//private void NewPermHandling(){//}@OverridepublicvoidonRequestPermissionsResult(int permissionRequestCode, String[] permissions, int[] grantResults) {
if (permissionRequestCode != REQUEST_PERMISSION) {
return;
}
if (grantResults.length && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
PermHandling();
} else {
// Ask the user to grant the permission
}
}
publicvoidRequestPermission(Activity thisActivity, String Permission, int Code) {
if (ContextCompat.checkSelfPermission(thisActivity,
Permission) !=
PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Permission)) {} else {
ActivityCompat.requestPermissions(thisActivity,
newString[] {
Permission
},
Code);
}
}
}
publicfinalstaticintREQUEST_CODE= -1010101;
@RequiresApi(api = Build.VERSION_CODES.M)publicvoidcheckDrawOverlayPermission() {
Log.v("App", "Package Name: " + getApplicationContext().getPackageName());
// Check if we already have permission to draw over other appsif (!Settings.canDrawOverlays(context)) {
Log.v("App", "Requesting Permission" + Settings.canDrawOverlays(context));
// if not construct intent to request permissionIntentintent=newIntent(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)@OverrideprotectedvoidonActivityResult(int requestCode, int resultCode, Intent data) {
Log.v("App", "OnActivity Result.");
//check if received result code// is equal our requested code for draw permissionif (requestCode == REQUEST_CODE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(this)) {
// Permission Granted by Overlay// Do your Stuff
}
}
}
}
publicbooleanCheckPermission(Context context, String Permission) {
if (ContextCompat.checkSelfPermission(context,
Permission) == PackageManager.PERMISSION_GRANTED) {
returntrue;
} else {
returnfalse;
}
}
}
startActivityForResult will call onActivityResult if you call this from an activity and not from service. Read more about it here
Solution 2:
The second post you have checked clearly shows the way of checking for SYSTEM_ALERT_WINDOW permission. But to simply and explain,
As mentioned on developer.android.com
Allows an app to create windows using the type TYPE_SYSTEM_ALERT, shown on top of all other apps. Very few apps should use this permission; these windows are intended for system-level interaction with the user.
Note: If the app targets API level 23 or higher, the app user must explicitly grant this permission to the app through a permission management screen. The app requests the user's approval by sending an intent with action ACTION_MANAGE_OVERLAY_PERMISSION. The app can check whether it has this authorization by calling Settings.canDrawOverlays().
and as mentioned in the SO post you checked,
Here are simplified steps:-
First check whether current device SDK version is greater than or equal to Android M (23) by following if condition
if (android.os.Build.VERSION.SDK_INT >= 23) { }
Then using Settings.canDrawOverlays() as mentioned in the developer.android.com check whether your application already have permission or not, we will check for do not have permission
if (android.os.Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(this)) { }
Then as mentioned in developer.android.com and as implemented in the SO post trigger an intent with ACTION_MANAGE_OVERLAY_PERMISSION.
if (android.os.Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(this)) { //Android M Or OverIntentintent=newIntent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, <YOUR REQUEST CODE>); return; }
Handle the result in onActivityResult() method defined in Activity, and again check using Settings.canDrawOverlays() if still not then finish() the activity after showing appropriate alert to user.
This whole flow you can implement after other permission flow is completed.
Solution 3:
This is the solution ,i search all the web. And can't find anything useful . answer is : when you ask for new permission don't ever ever do something else like showing toast or.... in my case i restart my app and ask for the next permission i use this code for restart the app ,
good luck.
@Don't Be negative You can try this , if not work please knock me again:
wm = (WindowManager) content.getSystemService(Service.WINDOW_SERVICE);
orientationChanger = newLinearLayout(content);
orientationChanger.setClickable(false);
orientationChanger.setFocusable(false);
orientationChanger.setFocusableInTouchMode(false);
orientationChanger.setLongClickable(false);
orientationLayout = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
windowType, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.RGBA_8888);
wm.addView(orientationChanger, orientationLayout);
orientationChanger.setVisibility(View.GONE);
orientationLayout.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
wm.updateViewLayout(orientationChanger, orientationLayout);
orientationChanger.setVisibility(View.VISIBLE);
Post a Comment for "How To Give Screen Overlay Permission On My Activity"