Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用PackageManager.setComponentEnabledSetting()启用其他应用程序的BroadcastReceiver_Android_Broadcastreceiver_Securityexception_Android Package Managers - Fatal编程技术网

Android 使用PackageManager.setComponentEnabledSetting()启用其他应用程序的BroadcastReceiver

Android 使用PackageManager.setComponentEnabledSetting()启用其他应用程序的BroadcastReceiver,android,broadcastreceiver,securityexception,android-package-managers,Android,Broadcastreceiver,Securityexception,Android Package Managers,我想从我的应用程序启动安卓设备上安装的其他应用程序的BroadcastReceiver。这是密码 ComponentName componentName = new ComponentName("com.example.myapp","com.example.myapp.MyBroadcastReceiver"); pkgManager.setComponentEnabledSetting(componentName, PackageManag

我想从我的应用程序启动安卓设备上安装的其他应用程序的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”的其他应用程序的包名

我参考了帖子中给出的答案,但似乎没有一个有效。应用程序继续抛出权限拒绝SecurityException。给定的是日志

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
public void setComponentEnabledSetting(ComponentName ComponentName,
int newState,int flags){
setEnabledSetting(componentName.getPackageName(),
componentName.getClassName(),newState,flags);
}  
public void setApplicationEnabledSetting(字符串appPackageName,
int newState,int flags){
setEnabledSetting(appPackageName、null、newState、标志);
}  
私有void setEnabledSetting(
最终字符串packageName、字符串className、int newState、最终int标志){
如果(!(newState==组件\启用\状态\默认值
||newState==组件\u启用\u状态\u启用
||newState==组件(已启用状态(已禁用)){
抛出新的IllegalArgumentException(“无效的新组件状态:”
+新闻国家);
}  
包装设置包装设置;
final int uid=Binder.getCallingUid();
final int permission=mContext.checkCallingPermission(
android.Manifest.permission.CHANGE\u组件(启用状态);
最终布尔值allowedByPermission=(permission==PackageManager.permission\u provided);
布尔sendNow=false;
布尔值isApp=(className==null);
String componentName=isApp?packageName:className;
int packageUid=-1;
阵列列表组件;
已同步(mPackages){
pkgSetting=mSettings.mPackages.get(packageName);
如果(pkgSetting==null){
如果(className==null){
抛出新的IllegalArgumentException(
“未知包:”+packageName);
}  
抛出新的IllegalArgumentException(
“未知组件:”+packageName
+“/”+类名);
}  
如果(!allowedByPermission&&(*uid!=pkgSetting.userId**)){
抛出新的SecurityException(
“权限拒绝:尝试将组件状态从pid更改为”
+Binder.getCallingPid()
+,uid=“+uid+”,package uid=“+pkgSetting.userId);
}  
....  
}  
它将比较uid,因此无法禁用或启用其他应用程序。 from:/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

这是from-应该在答案中清楚地回答
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);  
            }  
....  
}