2

我已经从 4.0.3 中分离了联系人,并且编译成功。当我尝试安装它时,它会引发以下错误:

01-27 05:31:21.865: E/DatabaseUtils(601): Writing exception to parcel
01-27 05:31:21.865: E/DatabaseUtils(601): java.lang.SecurityException: The caller must have permissions com.android.voicemail.permission.ADD_VOICEMAIL AND com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL
01-27 05:31:21.865: E/DatabaseUtils(601):   at com.android.providers.contacts.VoicemailPermissions.checkCallerHasFullAccess(VoicemailPermissions.java:64)
01-27 05:31:21.865: E/DatabaseUtils(601):   at com.android.providers.contacts.CallLogProvider.checkVoicemailPermissionAndAddRestriction(CallLogProvider.java:289)
01-27 05:31:21.865: E/DatabaseUtils(601):   at com.android.providers.contacts.CallLogProvider.query(CallLogProvider.java:132)
01-27 05:31:21.865: E/DatabaseUtils(601):   at android.content.ContentProvider$Transport.query(ContentProvider.java:178)
01-27 05:31:21.865: E/DatabaseUtils(601):   at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
01-27 05:31:21.865: E/DatabaseUtils(601):   at android.os.Binder.execTransact(Binder.java:338)
01-27 05:31:21.865: E/DatabaseUtils(601):   at dalvik.system.NativeStart.run(Native Method)
01-27 05:31:21.996: E/DatabaseUtils(601): Writing exception to parcel
01-27 05:31:21.996: E/DatabaseUtils(601): java.lang.SecurityException: The caller must have permissions com.android.voicemail.permission.ADD_VOICEMAIL AND com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL 

虽然以下几行在联系人清单文件中:

<uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
<uses-permission android:name="com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL" />
4

1 回答 1

1

VoicemailContract 的 Google 文档中没有包含一些信息,可以解释您的问题:

http://developer.android.com/about/versions/android-4.0.html(向下滚动到“语音邮件提供商”)

语音信箱提供商

新的语音邮件提供程序允许应用程序向设备添加语音邮件,以便在单个可视化演示中呈现所有用户的语音邮件。例如,用户可能有多个语音邮件源,例如一个来自电话服务提供商,另一个来自 VoIP 或其他替代语音服务。这些应用程序可以使用语音邮件提供程序 API 将其语音邮件添加到设备。然后,内置的电话应用程序将所有语音邮件以统一的方式呈现给用户。虽然系统的电话应用程序是唯一可以读取所有语音邮件的应用程序,但每个提供语音邮件的应用程序都可以读取它已添加到系统中的那些(但不能读取来自其他服务的语音邮件)。

由于 API 当前不允许第三方应用程序读取系统中的所有语音邮件,因此唯一应该使用语音邮件 API 的第三方应用程序是那些将语音邮件传递给用户的应用程序。

VoicemailContract 类定义了 Voicemail Provder 的内容提供者。VoicemailContract.Voicemails 和 VoicemailContract.Status 子类提供了表格,应用程序可以在其中插入语音邮件数据以存储在设备上。有关语音邮件提供商应用程序的示例,请参阅语音邮件提供商演示。

所以……基本上,即使他们有这个新的 API(很酷而且很有用),你也只能访问你的应用程序插入数据库的语音邮件。您无权访问您的设备拥有的任何其他语音邮件。

我仍然不确定是否应该为设备上的所有应用程序或仅系统应用程序触发广播意图,但由于我没有收到此广播,我只能假设它仅适用于系统应用程序.

从本质上讲,我的猜测是您的联系人应用程序的编译版本会尝试访问其代码中的所有语音邮件,从而导致您的异常。它通常可以毫无问题地执行此操作,因为它是具有系统签名的系统应用程序,但是当您自己安装它时不再适用。

于 2013-01-27T09:10:58.860 回答