Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android獲取其他應用權限(修改狀態)

android獲取其他應用權限(修改狀態)

編輯:關於Android編程

這兩天老大發話說要我研究一下安卓安全軟件的功能,先抽取了一個小模塊,研究權限管理

一開始就去packagemanager 去看發現有幾個方法:

就先去看了一下IPackagemanager 裡面的方法:

有很多 這裡我之列出跟權限有關的

     PermissionInfo getPermissionInfo(String name, int flags);  
          
        List queryPermissionsByGroup(String group, int flags);  
          
        PermissionGroupInfo getPermissionGroupInfo(String name, int flags);  
          
        List getAllPermissionGroups(int flags);  
      
        int checkPermission(String permName, String pkgName);  
          
        int checkUidPermission(String permName, int uid);  
          
        boolean addPermission(in PermissionInfo info);  
          
        void removePermission(String name);  
      
        void grantPermission(String packageName, String permissionName);  
      
        void revokePermission(String packageName, String permissionName);  
      
      String[] getAppOpPermissionPackages(String permissionName);  
      
    ParceledListSlice getPackagesHoldingPermissions(in String[] permissions,  
                int flags, int userId);  
     boolean addPermissionAsync(in PermissionInfo info);  
     void setPermissionEnforced(String permission, boolean enforced);  

看安全軟件上的功能:

通過包名找權限

通過權限找包名

禁用 提示 允許 三種狀態

首先:就發現了2個方法:

void removePermission(String name);  
void grantPermission(String packageName, String permissionName); 
我很高興的就開始寫代碼了 測試結果:  
java.lang.SecurityException: Can't change android.permission.INTERNET. It is required by the application  
一直報這個錯  
  
查看源碼其實查到了是需要檢查權限,源碼就不貼了,想要繞過檢查這個方法,可以通過hook的方式,猜測把源碼修改一下也可以用,目前這種方案先放棄。 

我又去網上查了一部分資料:看到這個類AppOpsManager 我就明白了 我找到相應的服務端代碼IAppOpsService:

    interface IAppOpsService {  
        // These first methods are also called by native code, so must  
        // be kept in sync with frameworks/native/include/binder/IAppOpsService.h  
        int checkOperation(int code, int uid, String packageName);  
        int noteOperation(int code, int uid, String packageName);  
        int startOperation(IBinder token, int code, int uid, String packageName);  
        void finishOperation(IBinder token, int code, int uid, String packageName);  
        void startWatchingMode(int op, String packageName, IAppOpsCallback callback);  
        void stopWatchingMode(IAppOpsCallback callback);  
        IBinder getToken(IBinder clientToken);  
      
        // Remaining methods are only used in Java.  
        int checkPackage(int uid, String packageName);  
        List getPackagesForOps(in int[] ops);
       List getOpsForPackage(int uid, String packageName, in int[] ops);  
        void setMode(int code, int uid, String packageName, int mode);
        void resetAllModes(int reqUserId, String reqPackageName);  
        int checkAudioOperation(int code, int usage, int uid, String packageName);  
        void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages);  
      
        void setUserRestrictions(in Bundle restrictions, int userHandle);  
        void removeUser(int userHandle);  
    }  

它通過mode的方式來設置狀態,

可以通過包名獲取權限

也可以通過權限獲取包名

更重要的是返回權限不是全部的 會根據級別 系統寫好的返回給你

你可以根據權限做個分級,這一切就明朗了

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved