0

我真的不喜欢所有的 MediaScanner Android 系统以及它是如何实现的、电池消耗、卡无法访问等,所以我制作了一个基于目录的图像查看器。我知道如何从控制台禁用(启用)扫描仪:

su & pm disable (enable) com.android.providers.media/com.android.providers.media.MediaScannerReceiver

现在,我想从查看器的 java 代码中执行此操作。当然我可以做一个Runtime.getRuntime().exec(...),但我有一些问题:

1)有没有办法做到这一点Runtime.getRuntime().exec()

2)我怎么知道MediaScannerReceiver是启用还是禁用?我用谷歌搜索了这个,我找不到答案。MediaScannerConnection似乎无法控制这一点。其实我也不知道是什么pm...

3)是否可以在没有root访问权限的情况下执行此操作?

谢谢!

4

1 回答 1

0

第2部分)。这是主要问题,这是一个解决方案:

    ComponentName sc = new ComponentName("com.android.providers.media", "com.android.providers.media.MediaScannerReceiver");
    int isEnabled = getPackageManager().getComponentEnabledSetting(sc);
    if (isEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { ... }

第1部分)。方法是:

ComponentName sc = new ComponentName("com.android.providers.media", "com.android.providers.media.MediaScannerReceiver");
getPackageManager().setComponentEnabledSetting(sc, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);

问题是这不起作用(致命错误java.lang.SecurityException: Permission Denial: attempt to change component state from pid=23632, uid=10133, package uid=10081),因为这是一个系统包。这是由于第 3 部分:

第 3 部分)甚至不需要 root 访问权限,出于安全原因,它不能通过 API 在 java 代码中完成:API 根本不允许这样做。所以在我看来这Runtime.getRuntime().exec("su & pm ...")是唯一的方法。

于 2013-05-04T18:01:39.103 回答