How to Give Screen Overlay Permission On My Activity

后端 未结 3 1933
眼角桃花
眼角桃花 2020-12-15 06:26

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

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-15 06:52

    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:

     
     
    

    Disabling the pull notifications

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

    Your code after modifications

    public class MainActivity extends Activity {
    
     public static final int REQUEST_PERMISSION = 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, REQUEST_PERMISSION);
       RequestPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION);
       RequestPermission(MainActivity.this, Manifest.permission.NFC, REQUEST_PERMISSION);
    
       //NewPermHandling();
      }
    
     }
    
     private void PermHandling() {
      //My app internal parts....
      //Here my stuff works...
     }
    
     //private void NewPermHandling(){
    
     //}
    
     @Override
     public void onRequestPermissionsResult(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
      }
     }
    
     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

提交回复
热议问题