Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
290 views
in Technique[技术] by (71.8m points)

android - 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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" /> 
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...