µ¼Óï
±¾ÎÄÖ÷Òª½²½âÁËAndroid ȨÏÞ¹ÜÀí·½Ãæ¼¸¸öµã£º
Android ȨÏÞ±³¾°ÖªÊ¶£»
ȨÏÞ¼ì²é¼°È¨ÏÞ¼æÈÝ£»
Ìø×ªµ½app¹ÜÀíȨÏÞÒ³Ãæ
Ò»¡¢Android ȨÏÞ±³¾°ÖªÊ¶
Ìáµ½Android ȨÏÞ¹ÜÀí£¬ÒµÄÚÈËÊ¿¶¼ÖªµÀGoogle ÔÚAndroid 6.0ʱÌá³öÁËÔËÐÐʱȨÏÞ¹ÜÀí»úÖÆ£¬ÔÚAndroid
6.0֮ǰ£¬ËùÉêÇëµÄȨÏÞÖ»ÐèÒªÔÚAndroidManifest.xmlÁоپͿÉÒÔ£¬´Ó¶øÈÝÒ×µ¼ÖÂһЩ°²È«Òþ»¼£¬Òò´Ë£¬ÔÚAndroid
6.0 ʱ£¬Google ΪÁ˸üºÃµÄ±£»¤Óû§Òþ˽Ìá³öÁËеÄȨÏÞ¹ÜÀí»úÖÆ£¨¹ÙÍø £ºWorking with
System Permissions£©£¬Í¬Ê±½«Æä·ÖΪÁ½´óÀࣺ
£¨1£©Normal Permissions
Normal Permissions Ò»°ã²»Éæ¼°Óû§Òþ˽£¬ÊDz»ÐèÒªÓû§½øÐÐÊÚȨµÄ£¬±ÈÈçÊÖ»úÕ𶯡¢·ÃÎÊÍøÂçµÈ£»
£¨2£©Dangerous Permission
Dangerous PermissionÒ»°ãÊÇÉæ¼°µ½Óû§Òþ˽µÄ£¬ÐèÒªÓû§½øÐÐÊÚȨ£¨¶¯Ì¬ÉêÇ룩£¬±ÈÈç¶ÁÈ¡SIM¿¨×´Ì¬¡¢·ÃÎÊͨѶ¼¡¢SD¿¨¶ÁдµÈ¡£
ͨ¹ý adb shell pm list permissions -d
-g ¿ÉÒԲ鿴 Dangerous Permission £¨ÒÔȨÏÞ×éÐÎʽ£©

Dangerous Permission group
ÈçÉÏͼËùʾ £ºDangerous Permission Ò»°ãÒÔ Permission group
ÐÎʽ´æÔÚ£¬Ö»Òª Permission groupÖÐijһ¸ö permission ±»Granted£¬ÔòÕû¸öPermission
groupϵÄȨÏÞ¾ù±»Granted £¨Ä¿Ç°ÊÇÕâÑù£¬ÒÔºó¹æÔò˵²»¶¨»á±ä£©¡£
¶þ¡¢È¨ÏÞ¼ì²é¼°È¨ÏÞ¼æÈÝ
±¾½ÚÖ÷Òª½éÉܽéÉÜÈçºÎ½øÐÐȨÏÞ¼ì²é¼°È¨ÏÞ¼æÈÝ£¬Ö÷Òª·ÖΪÒÔϼ¸Àࣺ
£¨1£©targetSdkVersion>=23£¬ÖÕ¶ËÉ豸ÊÇ6.0£¨api
23£©ÒÔÉÏϵͳ£»
°²×°µÄʱºò²»»á»ñµÃȨÏÞ£¬ÔÚÔËÐÐʱÏòÓû§ÉêÇë¶ÔӦȨÏÞ¡£Õⲿ·ÖȨÏÞ¼ì²é±È½Ï¼òµ¥£¬²»É漰ȨÏÞ¼æÈÝ£¬Ê¹Óùٷ½·½°¸¾Í¿ÉÒÔ
£¬Ê¹Óà Context : : checkSelfPermisson £¬½¨ÒéʹÓà ContextCompat : : checkSelfPermisson ¼ì²éȨÏÞ
¼´¿É £¬Ò»°ã¼ì²éÁ÷³Ì ÈçÏ£º
1.ÅжÏÊÇ·ñÓжÔӦȨÏÞ
£¨ ContextCompat : : checkSelfPermisson £©
2.ÅжÏÊÇ·ñÐèÒª½âÊͶÔӦȨÏÞÓÃ;£¨ ActivityCompat :: shouldShowRequestPermissionRationale £©
Èç¹ûÐèÒª½âÊÍ£¬ÔòÏÖʵ×Ô¶¨ÒåȨÏÞ½çÃæ¼´¿É
3.²»ÐèÒª½âÊ͵ϰ£¬Ö±½ÓÇëÇó¶ÔӦȨÏÞ
£¨ActivityCompat::requestPermissions£©
ÉÏÊöÇé¿ö½ÏΪ¼òµ¥£¬Ôڴ˲»ÔÙ׸Êö¡£
£¨2£©targetSdkVersion<23£¬ÖÕ¶ËÉ豸ÊÇ6.0£¨api
23£©ÒÔÉÏϵͳ£»
ʹÓõÄÊÇÀϵÄȨÏÞ»úÖÆ£¬ÔÚapp °²×°Ê±»áѯÎÊAndroidManifest.xmlÎļþÖеÄȨÏÞ£¬µ«ÊÇÓû§¿ÉÒÔÔÚÉèÖÃÁбíÖйرÕÏà¹ØÈ¨ÏÞ£¬ÕâÖÖÇé¿ö¿ÉÄÜ»á¶ÔappÕý³£ÔËÐÐÔì³ÉÒ»¶¨Ó°Ïì¡£
£¨3£© ÖÕ¶ËÉ豸ϵͳСÓÚ6.0£¨api 23£©
´ó¼Ò¿ÉÄÜÒªÎÊ£¬ÖÕ¶ËÉ豸ϵͳСÓÚ6.0Çé¿ö»¹ÐèÒª¿¼ÂÇÂ𣬿϶¨ÊÇÓõÄÀϵÄȨÏÞ¹ÜÀí»úÖÆ£¬ÔÚapp °²×°Ê±»áѯÎÊAndroidManifest.xmlÎļþÖеÄȨÏÞ£¬Óû§¹Ø±Õ²»ÁË£¬ÕæµÄÊÇÕâÑùÂð
£¿
´ð°¸ÊÇ·ñ¶¨µÄ£¬ÔÚʵ²âÖз¢ÏÖ£¬Ä¿Ç°Óв»ÉÙ¹ú²úRom ÊÖ»úÔÚ6.0֮ǰ¾ÍÓйرÕȨÏ޵Ŀª¹Ø¡£ÕâÖÖÇé¿öÒ²ÊÇÎÒÃǼæÈݵĶÔÏó¡£
ÏÂÃæ½«»áÒÔ×Ô¼º¿ª·¢¹ý³ÌÖÐÓöµ½µÄÎÊÌâ½øÐÐÕ¹¿ª £¬Ä¿Ç°Æó¶ìFMÖ§³ÖÃâÁ÷ÁË£¬ÐèҪʹÓÃREAD_PHONE_STATEȨÏÞ
£¨¶ÁÈ¡SIM¿¨×´Ì¬£©£¬ÓÉÓÚ֮ǰδ¶Ô¸ÄȨÏÞÊÇ·ñ¹Ø±ÕûÓнøÐÐÏà¹ØÅжϣ¬Òò´ËÊÕµ½Á˺ܶàÀýÒòΪÉÏÊöȨÏ޹رգ¬µ¼ÖÂÃâÁ÷ʧ°ÜµÄÇé¿ö¡£
ÊÊÅä¹ý³ÌÈçÏ £º
£¨1£©Ê¹Óà try catch À´¼ì²éȨÏÞÊÇ·ñ¹Ø±Õ
Ïë·¨ºÜ¼òµ¥£¬Èç¹û¸ÄȨÏÞ±»Óû§½ûÖ¹ÁË£¬Äǿ϶¨»áÒì³££¬Òò´Ë¿ÉÒÔÔÚcatch ÖÐ×öÎÄÕ£¬½á¹û·¢ÏÖÕâÒ»Õиù±¾Ã»ÓÐÓã¬ÎªÉ¶ÁË
£¿ÒòΪʹÓà READ_PHONE_STATE ȨÏ޵ķ½·¨ÄÚ²¿ÒѾtry catch £¬ÍâÃæÎÞ·¨²¶»ñ£¬Òò´Ë¸Ã·½·¨Ê§Ð§¡£
£¨2£©ContextCompat : : checkSelfPermisson
¼ÈÈ»ÔÚ6.0 ¿ÉÒÔʹÓà Context : : checkSelfPermisson ½øÐÐȨÏÞ¼ì²é£¬ÄÇÄÜ·ñʹÓÃsupport
v4 ÖÐµÄ ContextCompat : : checkSelfPermisson ·½·¨ÁË£¬ÊÔһϣ¬·¢ÏÖÔÚapi
23 ÒÔÏÂʧЧ£¬ÎªÁË̽¾¿ÔÒò£¬²é¿´ÁË ActivityCompat : : requestPermissons
ÄÚ²¿ÊµÏÖ£¬ÈçÏÂ

ActivityCompat : : requestPermissons
ÄÚ²¿È¨ÏÞ¼ì²é·½·¨ÔÚapi 23 ÒÔÏ£¬Ê¹ÓõÄÊÇ PackageManager::checkPermission£¬ÔÙÈ¥²é¿´PackageManager::checkPermission·½·¨£¬ÈçÏ£º·¢ÏÖֻҪȨÏÞÔÚAndroidManifest.xmlÖÐ×¢²á¹ý£¬¾ù»áÈÏΪ¸ÃȨÏÞgranted
£¬Òò´ËÉÏÊö·½·¨ÔÚapi 23 ÒÔÏÂҲʧЧ¡£

PackageManager::checkPermission
²éÔÄÏà¹Ø×ÊÁϺÍÇë½Ì×éÄÚͬÊ£¬·¢ÏÖSupport V4 ÏÂÃæÓÐÒ»¸öרÃżì²éȨÏ޵Ť¾ßÀàPermissionChecker¡£
£¨3£©PermissionChecker
²é¿´PermissionCheckerÔ´Âë·¢ÏÖ £¬PermissionCheckerÄÚ²¿Êµ¼ÊÉÏʹÓõÄÊÇAppOpsManagerCompt£¬¶øAppOpsManagerÊÇÔÚapi
19 ¼ÓÈë½øÈëµÄ£¨AppOpsManagerºóÃæ½éÉÜ£©

PermissionChecker::checkPermission
½ø¶ø²é¿´AppOpsManagerCompat ÄÚ²¿ÊµÏÖ

AppOpsManagerCompat::permissionToOp
IMPLʵÏÖÈçÏ£º

IMPLʵÏÖ

´ÓÉÏͼ¿ÉÒÔ¿´³ö£ºÔÚapi 23ÒÔÏ£¬ AppOpsManagerImpl::permissionToOp
Ö±½Ó·µ»ØÎªnull £¬ÕâÖ±½Óµ¼ÖÂapi 23ÒÔÏÂȨÏÞ¼ì²é½«»á·µ»Ø granted £¬Òò´Ë£¬¸Ã·½·¨ÔÚapi
23 Ï£¬È¨ÏÞ¼ì²é·½·¨Ò²»áʧЧ¡£
£¨4£©AppOpsManager
API 19ÒÔÉÏ £¬Google ¹Ù·½ÌṩÁË AppOpsManager ÀàÀ´¼ì²éȨÏÞ£¬¿´µ½Õâ¸öapi
ʱ£¬ÄÔº£¸¡ÏÖ³ö ¡°ÌìÎÞ¾øÈË֮·°¡¡±£¬ÀïÃæÓÐÁ½¸ö±È½ÏÖØÒªµÄ·½·¨ £ºAppOpsManager::checkOp(int
op ,int uid ,String packageName) £¨hide·½·¨£©ºÍAppOpsManager::checkOp(String
op,int uid ,String packageName)£¨public ·½·¨ £¬api 23
ÒÔÉÏ¿ÉÓã©£¬²»¾Ë¼¿¼£¬Ö±½Óд³öÁËÈçÏÂÁ½¸ö·½·¨
1£©AppOpsManager::checkOp(int op ,int
uid ,String packageName)
ÐèҪʹÓ÷´Éä £º

AppOpsManager::checkOp(int op ,int uid ,String packageName)
2£©AppOpsManager::checkOp(String op,int
uid ,String packageName)
API >= 23 ²Å¿ÉÒÔʹÓà £º

AppOpsManager::checkOp(String op,int uid ,String
packageName)
ÔÚʵ²âÖз¢ÏÖ£¬api µÍÓÚ23ʱ £¬OP_READ_PHONE_STATE =51 ÕÒ²»µ½£¬µ¼Ö·´Éäʧ°Ü¡£
×Ðϸ²ì¿´ÁËһϠ6.0 £¨API 23 £©_NUM_OP = 62,ÈçÏ£¬ÎªºÎÕÒ²»µ½51
ÁË

6.0 £¨API 23 £©_NUM_OP = 62
ÄѲ»³É ÿ¸ö°æ±¾»¹²»Ò»Ñù£¬²é¿´ÆäËû°æ±¾£¬ÑéÖ¤ÁËÕâ¸öÏë·¨£º
5.1.1 £¨API 22 £©_NUM_OP = 48

5.1.1
Op¸öÊýÏÞÖÆ £¨ÐèÒªÕÒµ½¶ÔÓ¦Ô´Âë˵Ã÷**£©ÏêÇé ²Î¿´ £º
²é¿´Android ¶ÔÓ¦°æ±¾ _NUM_OP £¨Ä¿Ç°×î¸ßÖ§³Ö5.1.1°æ±¾£©
´Ëʱ£¬OP_READ_PHONE_STATE = 51 ÔÚ6.0£¨API 23£©ÒÔÏ£¬Í¨¹ý·´ÉäÊÇÕÒ²»µ½µÄ£¬Òò´Ë¶ÔÓÚREAD_PHONE_STATEȨÏÞ¼ì²é½öÏÞÓÚ6.0¼°6.0ÒÔÉÏ¡£
ͬʱҲ×Ðϸ¿´ÁËÒ»ÏÂAppOpsManager Àà½éÉÜ£¬²¢²»ÊÇΪ¿ª·¢ÕßÉè¼ÆµÄ£¬²»¹ýÆäËûȨÏÞ¼æÈÝ¿ÉÒÔʹÓÃÕâÖÖ·½·¨£¬Ç°ÌáÊÇ
Òª¿´OP_*ÊÇÔÚʲô°æ±¾²ÅÓеģ¬Ðè×ö¼æÈÝ·½°¸ ¡£
public
class AppOpsManager
extends Object
API for interacting with ¡°application
operation¡± tracking.
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 Context.
getSystemService with Context.APP_OPS_SERVICE. |
£¨5£©×îºó²é¿´Á˼¸¸öµÚÈý·½È¨Ï޿⣨ÔÝδ¿´Í꣩
PermissionsDispatcher
AndPermission
Èý¡¢Ìø×ªµ½app¹ÜÀíȨÏÞÒ³Ãæ
¼ÈÈ»ÔÚÕâÀï½²½âÌø×ªµ½app ¹ÜÀíȨÏÞÒ³ÃæµÄ·½·¨£¬¿ÉÏë¶øÖ®£¬ÊÂÇé¾ø¶Ô²»Ì«¼òµ¥¡£Android Ë鯬»¯²»½öÔÚ´æÔÚÓÚuiÊÊÅä
£¬Í¬ÑùÒ²´æÔÚÓÚÕâÀµ¼ÖÂÎÒÃÇÎÞ·¨Ê¹ÓÃͬһÖÖ·½Ê½Ìø×ªµ½app¹ÜÀíȨÏÞÒ³Ãæ£¨ÊÊÅ䣬Android ¿ª·¢ÓÀÔ¶µÄÍ´£©¡£
ÄÇÓÐûÓа취¿ÉÒÔ¼ò»¯ÊÊÅ乤×÷£¬¼õÉÙ¿ª·¢Á¿£¬·½·¨µ±È»ÓУ¬²»¹ýÐèÒªÎÒÃÇ×Ô¼ºÈ¥×ܽáºÍ̽Ë÷µÄ£¬Ä¿Ç°ÒÑÓз½·¨£º
£¨1£©Ö±½ÓÌø×ªµ½ÏµÍ³ÉèÖÃÒ³
Intent
intent =newIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Settings.ACTION_APPLICATION
_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package",get
PackageName(), null));
try{
startActivity(intent);
}catch(Exception exception) {
exception.printStackTrace();
} |
¼ÇµÃÒªÌí¼ÓÉÏ try catch £¬²»¼Ó¿ÉÄÜ»ácrash¡£ÕâÖÖ·½Ê½¾Í²»ÐèÒªÊÊÅä¸÷¸ö³§É̵IJ»Í¬°æ±¾rom£¬È±µãÊÇ£¬Óû§Ö»ÄÜÌø×ªµ½ÏµÍ³ÉèÖÃÒ³£¬È»ºóÈ¥ÕÒ¶ÔÓ¦app
µÄȨÏÞ¹ÜÀí£¨×Ü»áÓÐһЩÓû§ÕÒ²»µ½£©
£¨2£©Õ¾ÔÚǰÈ˵ļçÉÏ
ÒýÓÃǰÈ˾Ñ飺Android¸÷´óÊÖ»úÆ·ÅÆÊÖ»úÌø×ªµ½È¨ÏÞ¹ÜÀí½çÃæ £¨Î´Ò»Ò»ÑéÖ¤£¬±Ï¾¹Ã»ÄÇô¶àÊÖ»ú£©
ÄÇÊDz»ÊÇǰÈ˾ÑéÒ»¶¨¶ÔÁË£¬ÄǾͲ»Ò»¶¨ÁË£¬ÔÚµ±Ê±¿ÉÄÜÊǶԵģ¬ÔÚÏÖÔÚ¿ÉÄܾÍÐв»Í¨ÁË£¬ÏÖÔÚÒÔMIUIÌø×ªµ½app
ȨÏÞ¹ÜÀíÒ³ÃæÎªÀý½øÐÐ˵Ã÷¡£
1£©MIUI 6/7
Intent
localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.AppPermissions
EditorActivity");
localIntent.putExtra("extra_pkgname",
context.
getPackageName());
try{
startActivity(intent);
}catch(Exception exception) {
exception.printStackTrace();
} |
2£©MIUI 8
Intent
localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.Permission
sEditorActivity");
localIntent.putExtra("extra_pkgname",
context
.getPackageName());
try{
startActivity(intent);
}catch(Exception exception) {
exception.printStackTrace();
} |
¶Ô±È1£©ºÍ2£©·¢ÏÖ£¬ÔÚMIUI 6/7 ºÍMIUI 8 ÉÏÃæ£¬È¨ÏÞ¹ÜÀíÒ³ÃæµÄactivityÃû×Ö²»Ò»ÑùÁË£¬Òò´ËʹÓÃMIUI6/7µÄ·½·¨ÔÚMIUI8ÉϾͻáʧЧ£¬Èç¹ûûÓмÓÉÏtry
catch £¬¾Í»áÖ±½Ócrash¡£
¶ÔÓÚÉÏÊö±ä»¯£¬×÷Ϊһ¸ö¿ª·¢ÕßÒ»°ã¶¼ÊDz»ÖªµÀµÄ£¬¼´±ãͨ¹ý·´À¡·¢ÏÖÁËÕâ¸öÎÊÌ⣬ҲÓпÉÄܲ»ÖªµÀ¶ÔÓ¦µÄactivityÊÇʲô£¬´Ë¿ÌҪôËÑË÷ÍøÉÏÓÐûÓÐÀàËÆ½â¾ö·½°¸£¬ÒªÃ´ÇóÖúÓÚ¶ÔÓ¦rom
¿ª·¢³§É̵Ŀª·¢ÕßÂÛ̳ £¨ÓÐʱ½â¾ö»ØÓ¦ËÙ¶ÈÏ൱Âý£©£¬ÄÇÓÐûÓиüºÃµÄ°ì·¨ÁË£¬·½·¨Ïê¼û£¨3£©²¿·Ö¡£
£¨3£©²é¿´Ä³¸öROMµÄij¸ö°æ±¾µÄȨÏÞ¹ÜÀíÒ³ÃæµÄactivity
ÕâÀïÒÔ»ªÎªp8ΪÀý¼òҪ˵Ã÷£¬Ïêϸ²½ÖèÈçÏ£º
1£©Í¨¹ýÉèÖÃÕÒµ½¶ÔÓ¦appµÄȨÏÞ¹ÜÀíÒ³Ãæ£¬ÈçÏ£º

Æó¶ìfmÔÚ»ªÎªp8ÉϵÄȨÏÞ¹ÜÀíÒ³Ãæ
2£©ÕÒµ½¶ÔÓ¦Ò³ÃæµÄactivity
·½·¨Ò»£ºÍ¨¹ýadd ¹¤¾ß²é¿´Õ»¶¥Activity
adb
shell dumpsys activity | grep "mFocusedActivity"
|
Æó¶ìfmÔÚ»ªÎªp8ÉϵÄȨÏÞ¹ÜÀíÒ³Ãæ¶ÔÓ¦µÄactivity
¸üΪÏêϸµÄ¶ÑÕ»ÐÅÏ¢

ÏêϸµÄ¶ÑÕ»ÐÅÏ¢
·½·¨¶þ£ºÊ¹ÓÃActivity Tracer¹¤¾ß
ʹÓ÷½·¨£º¿É²Î¼ûÎÒ֮ǰµÄÎÄÕ £ºAndroid¿ª·¢¡ª¡ª С¹¤¾ß£¬´óЧÂÊ

ʹÓÃActivity Tracer²é¿´È¨ÏÞ¹ÜÀíÒ³Ãæ¶ÔÓ¦µÄactivity
|