बेशक, मैं गलत हो सकता हूं, लेकिन ऐसा लगता है कि संक्षिप्त उत्तर "नहीं, वहां नहीं है" दुर्भाग्य से। यहाँ 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 को खिलाने का कोई स्पष्ट तरीका नहीं है।
क्या आपको इसके बारे में कुछ मिला? मुझे लगता है कि परीक्षण करने का एकमात्र तरीका टेस्ट डीपीसी ऐप का उपयोग करना पड़ सकता है। यह खुला स्रोत है, लेकिन अभी भी एक विधि का परीक्षण करने के लिए बहुत सारे काम हैं। https://github.com/googlesamples/android-testdpc – fasteque
@fasteque: नहीं, मेरे पास कोई जवाब नहीं है, यही कारण है कि बक्षीस अभी भी बकाया है। मैंने टेस्ट डीपीसी को "शेन्ज़िगन्स के वर्क सेट के लिए पूरे एंड्रॉइड" में लम्बा किया। टेस्ट डीपीसी निश्चित रूप से अंडर-डॉक्यूमेंटेड है, मुझे नहीं पता कि "ऐप अनुमतियां प्रबंधित करें" पृष्ठ से उन चीज़ों को मैप करने के बारे में कोई जानकारी नहीं है जो वास्तविक एंड्रॉइड अनुमतियों को 'isPermissionRevokedByPolicy()', आदि द्वारा कवर किया जा सकता है। – CommonsWare