1

我想从我的应用程序启动安装在我的android设备上的其他应用程序的BroadcastReceiver。下面是代码使用PackageManager.setComponentEnabledSetting()启用其他应用程序的BroadcastReceiver()

ComponentName componentName = new ComponentName("com.example.myapp","com.example.myapp.MyBroadcastReceiver"); 
pkgManager.setComponentEnabledSetting(componentName, 
         PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
         PackageManager.DONT_KILL_APP); 

“com.example.myapp”是含有“MyBroadcastReceiver”

我提到在后Android PackageManager enable any applicationAndroid - can't enable BroadcastReceiver给出答案,但他们都不似乎其他应用程序的包名正在工作。应用程序继续抛出权限拒绝SecurityException。由于是logcat的

05-24 11:37:38.382: E/AndroidRuntime(8746): java.lang.SecurityException: Permission Denial: attempt to change component state from pid=8746, uid=10042, package uid=10041 

回答

2
public void setComponentEnabledSetting(ComponentName componentName, 
      int newState, int flags) { 
     setEnabledSetting(componentName.getPackageName(), 
       componentName.getClassName(), newState, flags); 
    } 

public void setApplicationEnabledSetting(String appPackageName, 
      int newState, int flags) { 
     setEnabledSetting(appPackageName, null, newState, flags); 
    } 



private void setEnabledSetting( 
      final String packageName, String className, int newState, final int flags) { 
     if (!(newState == COMPONENT_ENABLED_STATE_DEFAULT 
       || newState == COMPONENT_ENABLED_STATE_ENABLED 
       || newState == COMPONENT_ENABLED_STATE_DISABLED)) { 
      throw new IllegalArgumentException("Invalid new component state: " 
        + newState); 
     } 
     PackageSetting pkgSetting; 
     final int uid = Binder.getCallingUid(); 
     final int permission = mContext.checkCallingPermission( 
       android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); 
     final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); 
     boolean sendNow = false; 
     boolean isApp = (className == null); 
     String componentName = isApp ? packageName : className; 
     int packageUid = -1; 
     ArrayList<String> components; 
     synchronized (mPackages) { 
      pkgSetting = mSettings.mPackages.get(packageName); 
      if (pkgSetting == null) { 
       if (className == null) { 
        throw new IllegalArgumentException( 
          "Unknown package: " + packageName); 
       } 
       throw new IllegalArgumentException( 
         "Unknown component: " + packageName 
         + "/" + className); 
      } 
      if (!allowedByPermission && (**uid != pkgSetting.userId**)) { 
       throw new SecurityException( 
         "Permission Denial: attempt to change component state from pid=" 
         + Binder.getCallingPid() 
         + ", uid=" + uid + ", package uid=" + pkgSetting.userId); 
      } 
.... 
} 

它会比较UID,所以不能禁用或启用其他应用程序。 从:/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

+0

感谢您的输入.. –

+0

即从[Android的源(https://开头代码。 google.com/p/android-source-browsing/source/browse/services/java/com/android/server/PackageManagerService.java?repo=platform--frameworks--base&r=1ccac75e1f1b97eccb916a8de04fc1012b30f6e5&spec=svn.platform--frameworks-- base.6a67a38f46cafdb9a9cedf3351f7150140cf0bd7#4668) - 应该已经清楚地在答案 –

+0

是啊,这是来自Android的source.But Saurabh酒店似乎不明白.. – Hugo

相关问题