2015-12-03 3 views
13

एपीआई स्तर 23 जोड़ा isPermissionRevokedByPolicy() on PackageManager। यह "नीति के द्वारा" false वापस जाने के लिए अगर एक अनुरोध किया अनुमति एक निश्चित पैकेज के लिए अवरुद्ध है माना जाता है:सामान्य डेवलपर कैसे प्रयास करते हैं IPermissionRevokedByPolicy()?

आमतौर पर डिवाइस स्वामी या प्रोफ़ाइल स्वामी ने ऐसी नीति लागू हो सकती हैं।

कुछ ऐसा है जिसे एक डेवलपर isPermissionRevokedByPolicy() पैदा करने के लिए कुछ पैकेज/अनुमति संयोजन के लिए false वापस जाने के लिए, धोखाधड़ी का सेट कार्य के लिए पूरे एंड्रॉयड के माध्यम से जा से कम कर सकते हैं?

+0

क्या आपको इसके बारे में कुछ मिला? मुझे लगता है कि परीक्षण करने का एकमात्र तरीका टेस्ट डीपीसी ऐप का उपयोग करना पड़ सकता है। यह खुला स्रोत है, लेकिन अभी भी एक विधि का परीक्षण करने के लिए बहुत सारे काम हैं। https://github.com/googlesamples/android-testdpc – fasteque

+0

@fasteque: नहीं, मेरे पास कोई जवाब नहीं है, यही कारण है कि बक्षीस अभी भी बकाया है। मैंने टेस्ट डीपीसी को "शेन्ज़िगन्स के वर्क सेट के लिए पूरे एंड्रॉइड" में लम्बा किया। टेस्ट डीपीसी निश्चित रूप से अंडर-डॉक्यूमेंटेड है, मुझे नहीं पता कि "ऐप अनुमतियां प्रबंधित करें" पृष्ठ से उन चीज़ों को मैप करने के बारे में कोई जानकारी नहीं है जो वास्तविक एंड्रॉइड अनुमतियों को 'isPermissionRevokedByPolicy()', आदि द्वारा कवर किया जा सकता है। – CommonsWare

उत्तर

7

बेशक, मैं गलत हो सकता हूं, लेकिन ऐसा लगता है कि संक्षिप्त उत्तर "नहीं, वहां नहीं है" दुर्भाग्य से। यहाँ ApplicationPackageManager का कोड है::

एक और अधिक विस्तारित जवाब थोड़ा

@Override 
public boolean isPermissionRevokedByPolicy(String permName, String pkgName) { 
    try { 
     return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId()); 
    } catch (RemoteException e) { 
     throw new RuntimeException("Package manager has died", e); 
    } 
} 

जहां एम पी एम -

private final IPackageManager mPM; 

यह निर्माता है, जो ContextImpl.getPackageManager द्वारा कहा जाता है में प्रारंभ किया जा रहा है() :

@Override 
public PackageManager getPackageManager() { 
    if (mPackageManager != null) { 
     return mPackageManager; 
    } 

    IPackageManager pm = ActivityThread.getPackageManager(); 
    if (pm != null) { 
     // Doesn't matter if we make more than one instance. 
     return (mPackageManager = new ApplicationPackageManager(this, pm)); 
    } 

    return null; 
} 

(source code)

गहरी जा रहे हैं और ActivityThread.getPackageManager (में देख):

public static IPackageManager getPackageManager() { 
    if (sPackageManager != null) { 
     //Slog.v("PackageManager", "returning cur default = " + sPackageManager); 
     return sPackageManager; 
    } 
    IBinder b = ServiceManager.getService("package"); 
    //Slog.v("PackageManager", "default service binder = " + b); 
    sPackageManager = IPackageManager.Stub.asInterface(b); 
    //Slog.v("PackageManager", "default service = " + sPackageManager); 
    return sPackageManager; 
} 

(source code)

इन सभी चरणों मैं btw isPermissionRevokedByPolicy के वास्तविक क्रियान्वयन को खोजने के लिए कर रहा था। तब मुझे यह पता लगाना पड़ा कि कौन आईपैकेज मैनेजर को बढ़ाता है। स्टब - यह पैकेजमैनेजर सेवा है (source code)।

@Override 
public boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId) { 
    if (UserHandle.getCallingUserId() != userId) { 
     mContext.enforceCallingPermission(
       android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, 
       "isPermissionRevokedByPolicy for user " + userId); 
    } 
    if (checkPermission(permission, packageName, userId) 
      == PackageManager.PERMISSION_GRANTED) { 
     return false; 
    } 
    final long identity = Binder.clearCallingIdentity(); 
    try { 
     final int flags = getPermissionFlags(permission, packageName, userId); 
     return (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0; 
    } finally { 
     Binder.restoreCallingIdentity(identity); 
    } 
} 

संभावित "नकली" विशेष रूप से अनुमति की स्थिति, आप checkPermission और getPermissionFlags तरीकों को हैक करने की आवश्यकता होगी:

तो यहाँ वास्तविक क्रियान्वयन है। समस्या, मुझे डर है कि कम से कम, प्रतिबिंब के बिना, पैकेज मैनेजर सेवा के साथ ApplicationPackageManager को खिलाने का कोई स्पष्ट तरीका नहीं है।

+0

धन्यवाद, लेकिन मैं जरूरी नहीं है कि मैं कोशिश कर रहा हूं नकली रद्द करने के लिए। मैं बस इस विधि को कम से कम प्रयास के साथ 'सत्य' वापस करने के लिए प्राप्त करना चाहता हूं।उदाहरण के लिए: ''DevicePoleraManager' पर 'setCameraDisabled()' है (http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setCameraDisabled%28android.content.ComponentName,%20boolean%29) 'सत्य' वापस करने के लिए 'Manifest.permission.CAMERA' के लिए 'PermissionRevokedByPolicy()' है? 'setCameraDisabled() 'को एक नियमित डिवाइस व्यवस्थापक द्वारा बुलाया जा सकता है, जरूरी नहीं कि डिवाइस के मालिक, पॉलिसी स्वामी या कार्य के लिए अन्य एंड्रॉइड। – CommonsWare

+0

@ कॉमन्सवेयर यप, मैं विशेष रूप से पाठ में निरसन पर ध्यान केंद्रित करने में लिखित रूप में थोड़ा गलत हो सकता हूं, लेकिन फिर भी, यह सभी प्रकार के फ़ोकिंग के लिए सच है। SetCameraDisabled() के बारे में - मैं इसके बारे में और सोचूंगा। अगर कुछ भी मेरे दिमाग में आता है - मैं जवाब अपडेट कर दूंगा .. –

+0

@ कॉमन्सवेयर सेट कैमेराडिएबल() कारण नहीं है PermissionRevokedByPolicy() सच लौटने के लिए। यह वास्तव में भ्रमित है कि डिवाइस सुविधाओं को नियंत्रित करने के लिए कई एपिस क्यों हैं। मेरी समझ के अनुसार प्रबंधित प्रावधान कुछ अतिरिक्त चीजों के साथ डिवाइस प्रशासन के समान है। Google हो सकता है कि अनावश्यक एपीआई आगे बढ़ने के बारे में सोचें। अगर मैं गलत हूं कृपया मुझे सही। – 7383

0

मुझे नहीं लगता कि एक सीधा तरीका है। लेकिन अगर कॉलिंग पैकेज के रनटाइम permissionstate को बदल दिया जा सकता है, तो ispermissionrevokedbypolicy() झूठी वापसी करेगा। लेकिन मुझे लगता है कि यह एक मुश्किल हिस्सा भी होगा।

संबंधित मुद्दे