只有系统应用程序在清单文件中才能被授予权限。

26

我想在我的Android清单中添加这个权限:

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
但是当我将这个权限复制到我的清单文件中后,它出现了红色下划线并显示:

该权限仅授予系统应用程序

我该怎么办?


你正在使用哪个需要此权限的API调用? - A--C
@A--C 我正在尝试这个教程。http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html - Reza_Rg
14
我遇到了同样的问题。我只需要执行“项目”->“清理”就解决了。请参考:https://dev59.com/KmvXa4cB1Zd3GeqPHDss#13531632 - Dheeraj Vepakomma
1
尝试使用此已接受的答案:https://dev59.com/GGYr5IYBdhLWcg3wR4Us - Noman
@Noman 哇!好的解决方案!我会记在心里,为我的下一个项目做准备。谢谢。 - Reza_Rg
显示剩余2条评论
7个回答

65

MODIFY_PHONE_STATE 权限仅授予系统应用程序。

就您的信息而言,有两种类型的Android应用程序:系统和用户。

用户应用程序 就是所有在Google Play商店、Amazon应用商店或侧载安装的普通应用程序。这些应用程序存储在Android手机的/data分区中,即用于存储用户数据和应用程序的内部存储器的一部分。

系统应用程序 基本上是随ROM预先安装的应用程序。在标准的Android用户环境中,用户无法写入/system分区,因此,直接安装或卸载系统应用程序是不可能的。

为了将应用程序安装为Android设备上的系统应用程序,您的设备必须要么已经rooted,要么已经安装了自定义恢复(或两者都有)。

话虽如此,该错误实际上是错误的,因为您具有有效的代码,编译应该可以正常工作。最好改为发出警告。在Eclipse中,您可以轻松解决此问题。只需按照以下步骤操作:

Window -> Preferences -> Android -> Lint Error Checking。

从列表中找到ProtectedPermission,并将其严重性设置为错误之外的其他级别(例如信息)。这样,您的项目仍然可以编译。


6
MODIFY_PHONE_STATE是一个仅限系统使用的权限。系统应用程序要么预先安装到系统文件夹中,要么由制造商使用他们的安全证书编译。
因此,如果您正在尝试做这个操作,您正在尝试使用不再受支持的API。在Android 2.3+版本中,您可以监视来电,但不允许阻止(我认为从您发布的链接中这就是您想做的事情)。
如果您需要遵循Android问题,请查看:Issue 15022Issue 14789

是的,我正在尝试阻止来电,所以这个问题真的很糟糕。 - Reza_Rg
那么,Play商店上有一些可以进行呼叫拦截的应用程序吗? - Reza_Rg
我不认为他们会阻止电话。他们说他们可以,但实际上他们只能通知用户(当被屏蔽的号码打来时),而不能完全阻止它。当然,这一切都是在Android 2.3+版本中。 - gsb

4

在SDK 19及以上版本中,当您更改清单时会出现此错误。 进行项目清理和构建。 这应该可以清除此错误。


4
这应该是一条评论,而不是答案。 - Matt Bodily

2
只需要清理一下你的项目,就像这样:
项目 > 清理…

1
有四种权限类型。
Regular
Dangerous
Signed
Signed or System

前两个可以被简单应用程序使用另外两个只能被框架内构建的应用程序使用


1
由于这是系统级权限设备,开发人员无法授予此权限,应用程序开发工具也会对此发出警告,因此您需要简单地清理项目并重新构建它。

0

从列表中查找ProtectedPermission

Window -> Preferences -> Android -> Lint Error Checking.

并将严重性级别设置为除了错误之外的其他级别(例如信息)。这样,您的项目仍将编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接