国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android 獲取判斷是否有懸浮窗權(quán)限的方法

2019-12-12 00:38:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

現(xiàn)在很多應(yīng)用都會(huì)用到懸浮窗,很多國(guó)產(chǎn)rom把懸浮窗權(quán)限加入控制了,你就需要判斷是否有懸浮窗權(quán)限,然后做對(duì)應(yīng)操作。

Android 原生有自帶權(quán)限管理的,只是被隱藏了??碼ndroid源碼在android.app下就有個(gè)AppOpsManager類。

類說(shuō)明如下:

/** * API for interacting with "application operation" tracking. * * <p>This API is not generally intended for third party application developers; most * features are only available to system applications. Obtain an instance of it through * {@link Context#getSystemService(String) Context.getSystemService} with * {@link Context#APP_OPS_SERVICE Context.APP_OPS_SERVICE}.</p> */

上面說(shuō)明了只對(duì)系統(tǒng)應(yīng)用有用,rom廠商們應(yīng)該就是利用這個(gè)AppOps機(jī)制開(kāi)放一些權(quán)限控制。

我們要判斷是否有權(quán)限該如何做呢?就只能通過(guò)反射去判斷了。

AppOpsManager的checkOp方法,就是檢測(cè)是否有某項(xiàng)權(quán)限的方法有這些返回值,分別是允許,忽略,錯(cuò)誤和默認(rèn):

/** * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is * allowed to perform the given operation. */public static final int MODE_ALLOWED = 0;/** * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is * not allowed to perform the given operation, and this attempt should * <em>silently fail</em> (it should not cause the app to crash). */public static final int MODE_IGNORED = 1;/** * Result from {@link #checkOpNoThrow}, {@link #noteOpNoThrow}, {@link #startOpNoThrow}: the * given caller is not allowed to perform the given operation, and this attempt should * cause it to have a fatal error, typically a {@link SecurityException}. */public static final int MODE_ERRORED = 2;/** * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller should * use its default security check. This mode is not normally used; it should only be used * with appop permissions, and callers must explicitly check for it and deal with it. */public static final int MODE_DEFAULT = 3;

只有MODE_ALLOWED才是確定有權(quán)限的。

類里面checkOp方法如下,三個(gè)參數(shù)分別是操作id,uid和包名:

/** * Do a quick check for whether an application might be able to perform an operation. * This is <em>not</em> a security check; you must use {@link #noteOp(int, int, String)} * or {@link #startOp(int, int, String)} for your actual security checks, which also * ensure that the given uid and package name are consistent. This function can just be * used for a quick check to see if an operation has been disabled for the application, * as an early reject of some work. This does not modify the time stamp or other data * about the operation. * @param op The operation to check. One of the OP_* constants. * @param uid The user id of the application attempting to perform the operation. * @param packageName The name of the application attempting to perform the operation. * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without * causing the app to crash). * @throws SecurityException If the app has been configured to crash on this op. * @hide */public int checkOp(int op, int uid, String packageName) { try {  int mode = mService.checkOperation(op, uid, packageName);  if (mode == MODE_ERRORED) {   throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));  }  return mode; } catch (RemoteException e) { } return MODE_IGNORED;}

操作id即op可以在該類中找到靜態(tài)值定義,android23里面有62種權(quán)限,我們需要的是OP_SYSTEM_ALERT_WINDOW=24

知道這些就可以用反射把我們的方法寫(xiě)出了:

 /**  * 判斷 懸浮窗口權(quán)限是否打開(kāi)  *  * @param context  * @return true 允許 false禁止  */ public static boolean getAppOps(Context context) {  try {   Object object = context.getSystemService("appops");   if (object == null) {    return false;   }   Class localClass = object.getClass();   Class[] arrayOfClass = new Class[3];   arrayOfClass[0] = Integer.TYPE;   arrayOfClass[1] = Integer.TYPE;   arrayOfClass[2] = String.class;   Method method = localClass.getMethod("checkOp", arrayOfClass);   if (method == null) {    return false;   }   Object[] arrayOfObject1 = new Object[3];   arrayOfObject1[0] = Integer.valueOf(24);   arrayOfObject1[1] = Integer.valueOf(Binder.getCallingUid());   arrayOfObject1[2] = context.getPackageName();   int m = ((Integer) method.invoke(object, arrayOfObject1)).intValue();   return m == AppOpsManager.MODE_ALLOWED;  } catch (Exception ex) {   }  return false; }

測(cè)試在魅族華為小米大部分機(jī)型上都是可以的,但這個(gè)方法也不能保證正確,一些機(jī)型上會(huì)返回錯(cuò)誤即MODE_ERRORED,就是獲取不到權(quán)限值,這個(gè)方法就返回了false,但實(shí)際上懸浮窗是可以使用的。

以上這篇Android 獲取判斷是否有懸浮窗權(quán)限的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桓台县| 建水县| 金沙县| 石林| 德令哈市| 磴口县| 城市| 清徐县| 辽阳市| 鄂托克前旗| 金寨县| 邵阳市| 武宣县| 五大连池市| 奎屯市| 鲁甸县| 左贡县| 琼结县| 托克托县| 贡觉县| 三江| 宝应县| 大丰市| 长沙市| 涡阳县| 治多县| 湖北省| 茌平县| 疏勒县| 衡南县| 泸溪县| 阜新市| 娱乐| 贺兰县| 富蕴县| 正宁县| 新安县| 汝阳县| 九寨沟县| 白玉县| 北碚区|