亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2018年07月31日 11:21:13   作者:安地Andy  
今天小編就為大家分享一篇Android 獲取判斷是否有懸浮窗權(quán)限的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

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

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

類說明如下:

/**
 * 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>
 */

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

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

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

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

 /**
  * 判斷 懸浮窗口權(quán)限是否打開
  *
  * @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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解AndroidStudio中代碼重構(gòu)菜單Refactor功能

    詳解AndroidStudio中代碼重構(gòu)菜單Refactor功能

    這篇文章主要介紹了AndroidStudio中代碼重構(gòu)菜單Refactor功能詳解,本文通過代碼演示,功能截圖來詳細(xì)說明as為大名重構(gòu)提供的各項(xiàng)功能,需要的朋友可以參考下
    2019-11-11
  • ListView的View回收引起的checkbox狀態(tài)改變監(jiān)聽等問題解決方案

    ListView的View回收引起的checkbox狀態(tài)改變監(jiān)聽等問題解決方案

    之前講到了自定義Adapter傳遞給ListView時(shí),因?yàn)長(zhǎng)istView的View回收,需要注意當(dāng)ListView列表項(xiàng)中包含有帶有狀態(tài)標(biāo)識(shí)控件的問題,感興趣的朋友可以祥看本文,或許會(huì)有意外的收獲哦
    2013-01-01
  • 詳解Android中AsyncTask機(jī)制

    詳解Android中AsyncTask機(jī)制

    在Android當(dāng)中,提供了兩種方式來解決線程直接的通信問題,一種是通過Handler的機(jī)制,還有一種就是今天要詳細(xì)講解的 AsyncTask 機(jī)制,對(duì)android中asynctask相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Android編程實(shí)現(xiàn)監(jiān)聽EditText變化的方法

    Android編程實(shí)現(xiàn)監(jiān)聽EditText變化的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)監(jiān)聽EditText變化的方法,涉及Android針對(duì)EditText的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android中EditText如何去除邊框添加下劃線

    Android中EditText如何去除邊框添加下劃線

    這篇文章主要介紹了Android中EditText如何去除邊框添加下劃線的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Kotlin startActivity跳轉(zhuǎn)Activity實(shí)現(xiàn)流程詳解

    Kotlin startActivity跳轉(zhuǎn)Activity實(shí)現(xiàn)流程詳解

    在Android當(dāng)中,Activity的跳轉(zhuǎn)有兩種方法,第一個(gè)是利用startActivity(Intent intent);的方法,第二個(gè)則是利用startActivityForResult(Intent intent,int requestCode);的方法,從字面上來看,這兩者之間的差別只在于是否有返回值的區(qū)別,實(shí)際上也確實(shí)只有這兩種區(qū)別
    2022-12-12
  • 詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)

    詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)

    這篇文章主要介紹了詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí),詳細(xì)介紹如何使用MediaProjection,MediaCodec以及MediaMuxer來實(shí)現(xiàn)簡(jiǎn)單的截屏和錄屏功能。
    2017-04-04
  • Android高級(jí)界面組件之拖動(dòng)條和評(píng)星條的功能實(shí)現(xiàn)

    Android高級(jí)界面組件之拖動(dòng)條和評(píng)星條的功能實(shí)現(xiàn)

    這篇文章主要介紹了Android高級(jí)界面組件之拖動(dòng)條和評(píng)星條的實(shí)現(xiàn)實(shí)例,需要的的朋友參考下
    2017-03-03
  • Android拍照裁剪圖片

    Android拍照裁剪圖片

    智能手機(jī)像素非常高,完全可以當(dāng)相機(jī)使用,下面一段代碼給大家分享了android拍照裁剪圖片的功能,對(duì)android拍照裁剪圖片相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • kotlin協(xié)程之coroutineScope函數(shù)使用詳解

    kotlin協(xié)程之coroutineScope函數(shù)使用詳解

    這篇文章主要為大家介紹了kotlin協(xié)程之coroutineScope函數(shù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論