我真的不喜欢所有的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权限的情况下执行此操作?
谢谢!
答案 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 ...")
是唯一的方法。