当前位置: 首页 > 知识库问答 >
问题:

如何使用反射更改备份服务?

尉迟明辉
2023-03-14

我在这里发布了一个关于Android 5.1的一个新行为的问题,该行为在设备上设置设备所有者时禁用备份服务...

long ident = Binder.clearCallingIdentity();
try {
    IBackupManager ibm = IBackupManager.Stub.asInterface(
        ServiceManager.getService(Context.BACKUP_SERVICE));
    ibm.setBackupServiceActive(UserHandle.USER_OWNER, false);
} catch (RemoteException e) {
    throw new IllegalStateException("Failed deactivating backup service.", e);
} finally {
    Binder.restoreCallingIdentity(ident);
}

我的目标是重新启用备份服务,理想的情况是:

ibm.setBackupServiceActive(UserHandle.USER_OWNER, false);

你能帮我做这件事吗?

共有1个答案

万乐逸
2023-03-14

请尝试以下代码:

    try {
        Class<?> iBackupManagerClass = Class.forName("android.app.backup.IBackupManager");
        Class<?> serviceManagerClass = Class.forName("android.os.ServiceManager");
        Class<?>[] classes = iBackupManagerClass.getDeclaredClasses();
        Class<?> stubClass = null;
        for (Class clazz : classes) {
            if (clazz.getSimpleName().equals("Stub")) {
                stubClass = clazz;
            }
        }

        Method setBackupServiceActiveMethod = iBackupManagerClass.getMethod("setBackupServiceActive", int.class, boolean.class);
        Method asInterfaceMethod = stubClass.getMethod("asInterface", IBinder.class);
        Method getServiceMethod = serviceManagerClass.getMethod("getService", String.class);

        Object ibm = asInterfaceMethod.invoke(null, getServiceMethod.invoke(null, "backup"));
        setBackupServiceActiveMethod.invoke(ibm, 0, false);

    } catch (ClassNotFoundException e) {
        Log.e("TEST", e.getMessage(), e);
    } catch (NoSuchMethodException e) {
        Log.e("TEST", e.getMessage(), e);
    } catch (InvocationTargetException e) {
        Log.e("TEST", e.getMessage(), e);
    } catch (IllegalAccessException e) {
        Log.e("TEST", e.getMessage(), e);
    }

它将需要一些重构来捕获错误...

 类似资料:
  • 问题内容: 我有一堂课,但不幸的是,我需要在运行时更改它。 使用反射我得到这个错误: 有什么办法可以改变价值? 问题答案: 假设没有阻止你执行此操作,则可以使用来绕开并重置修饰符以摆脱,并实际上修改字段。 这是一个例子: 假设没有SecurityException抛出,上面的代码将打印出来”Everything is true”。 实际执行的操作如下: 基本boolean值true和falsein

  • 问题内容: 我的代码有最后一个问题,涉及反射包中的.Call函数。 所以我在打这样的电话: 我正在执行.Call的方法如下: 我不太了解的是如何操作“ in”变量,以便将需要的映射正确传递到函数中。我看到make()中的第二个参数是参数的长度吗?但是我不太了解如何格式化var以正确传递参数。我递归地遇到错误消息: 任何帮助将非常感激! 问题答案: 来自: 呼叫调用函数与输入参数。例如,如果,代表去

  • 使用Java反射更改私有静态final字段 我按照上面链接中的说明使用java反射更改私有静态final字段。我有一个名为“数据”的对象在“data”内部,有一个名为“type”的私有静态最终变量我想将“type”设置为null。这是我的密码。 我试着在Java1.7上用类似的代码来做这件事,结果成功了。但是在Android上运行此代码会产生以下错误:java。lang.NoSuchFieldEx

  • 问题内容: 我正在使用UCanAccess JDBC驱动程序(版本3.0.3.1)连接到mdb文件。我需要将该列添加到现有表中。问题是该语句 引发异常: 似乎没有新版本的UCanAccess。 在这种情况下我该怎么办?由于多种原因,我不想使用ODBC驱动程序(在此进行说明- 从不使用ODBC的Java中操作Access数据库) 我看到的唯一解决方案是创建表的副本(例如TEmployeeBackup

  • 问题内容: 我有以下脚本: 使用tor和SocksiPy 现在,我想更改每个请求的tor身份,例如: 我怎样才能做到这一点? 问题答案: 今天,我对这个问题进行了很多搜索,最后设法回答了自己。但是在我不得不说pirvoxy和tor应该正确配置之前。第一个脚本,然后是一些配置: 上面的脚本获取了新的IP并从ifconfig.me网站进行了检查。关于配置:我们需要Privoxy。要将TOR与HTTP连

  • 问题内容: 简单的问题,如何使此代码起作用? 输出: 问题答案: 作品。问题在于仅搜索方法。从javadoc: 返回一个Method对象,该对象反映此Class对象表示的类或接口的指定公共成员方法。 更新: 成功获取方法后,可以使用以下方法调用它: 即- 用一个元素创建一个新数组-该数组。使用变量名,它看起来像: