如何知道MediaScanner是否已启用?

时间:2013-05-04 15:22:50

标签: android android-mediascanner

我真的不喜欢所有的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是启用还是禁用?我用Google搜索,我找不到回复。 MediaScannerConnection似乎无法控制这一点。实际上,我不知道pm做了什么......

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

谢谢!

1 个答案:

答案 0 :(得分: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 ...")是唯一的方法。