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 (「ボイスメール プロバイダー」までスクロールします)

ボイスメール プロバイダー

新しい Voicemail Provider を使用すると、アプリケーションはボイスメールをデバイスに追加して、すべてのユーザーのボイスメールを 1 つの視覚的プレゼンテーションで表示できます。たとえば、ユーザーが複数のボイスメール ソースを持っている可能性があります。たとえば、1 つは電話のサービス プロバイダーからのもので、もう 1 つは VoIP またはその他の代替音声サービスからのものです。これらのアプリは、ボイスメール プロバイダー API を使用して、ボイスメールをデバイスに追加できます。組み込みの電話アプリケーションは、すべてのボイスメールを統一されたプレゼンテーションでユーザーに表示します。システムの電話アプリケーションはすべてのボイスメールを読み取ることができる唯一のアプリケーションですが、ボイスメールを提供する各アプリケーションは、システムに追加されたものを読み取ることができます (ただし、他のサービスからのボイスメールを読み取ることはできません)。

API は現在、サードパーティ アプリがシステムからすべてのボイスメールを読み取ることを許可していないため、ボイスメール API を使用する必要があるサードパーティ アプリは、ボイスメールをユーザーに配信するアプリのみです。

VoicemailContract クラスは、Voicemail Provider のコンテンツ プロバイダーを定義します。サブクラス VoicemailContract.Voicemails と VoicemailContract.Status は、アプリがボイスメール データを挿入してデバイスに保存できるテーブルを提供します。ボイスメール プロバイダー アプリの例については、ボイスメール プロバイダーのデモを参照してください。

つまり...基本的に、彼らがこの新しい API (クールで便利) を持っていても、アプリが DB に挿入したボイスメールにしかアクセスできません。デバイスにある他のボイスメールにはアクセスできません。

ブロードキャスト インテントをデバイス上のすべてのアプリに対して起動する必要があるのか​​、それともシステム アプリのみに対して起動する必要があるのか​​はまだわかりませんが、このブロードキャストを受信して​​いないため、システム アプリ専用であるとしか考えられません。 .

基本的に、コンパイルされたバージョンの連絡先アプリがそのコード内のすべてのボイスメールにアクセスしようとするため、例外が発生すると思います。システム署名付きのシステム アプリであるため、通常は問題なく実行できますが、自分でインストールすると適用されなくなります。

于 2013-01-27T09:10:58.860 に答える