1

アプリに連絡先を返す連絡先ピッカーがあり、そこからいくつかの情報を sharedPreferences に保存しています。共有設定では、ルックアップ キーを使用してデータを保持しています (Android ドキュメントが示唆しているようです)。

この部分は問題ないようで、検索キーを取得して保存します。

私の問題は、ルックアップキーを介して連絡先を検索する連絡先を取り戻すことになり、時々nullを返すようです

次の詳細は連絡先ピッカーから取得されます

 Contact lookup key from the contact picker: 850i%2bw7vj56otre6eqa9b9t7wa%3d%3d  
 Contact id: 2958

次に、次のコードを使用してルックアップ キーに基づいて連絡先を検索し、連絡先 ID を取得しようとします。

Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, Uri.encode("850i%2bw7vj56otre6eqa9b9t7wa%3d%3d"));
Uri res = ContactsContract.Contacts.lookupContact(context.getContentResolver(), lookupUri);

これを行った後、連絡先ピッカーからのものであるため、IDが有効であることはわかっていますが、「res」はnullです。

ルックアップで res uri をログに記録すると、次のようになります。

content://com.android.contacts/contacts/lookup/850i%252bw7vj56otre6eqa9b9t7wa%253d%253d

これは(エンコードされた後)、私がそうあるべきだと思ったものです。誰かが私が間違っていることを見つけることができますか?

問題は、ほとんどの人 (私自身を含む) で機能することですが、これに遭遇する人もいます。

4

2 に答える 2

2

Uri.decode()の代わりに使用Uri.encode()します。

編集:ドキュメント
によると:

ルックアップ キーはエンコードされていない状態で追加する必要があります。これはエンコードされた形式で保存され、URI ですぐに使用できます。

したがって、URI をエンコードまたはデコードしないでください。そのまま渡す。

于 2013-01-10T05:33:49.477 に答える
1

As Dheeraj V.S. said, you should not neither encode or decode the lookupkey it is allready encoded so re-encoding it may have strange results. Now I think that your approach creates problems with contacts that have their id changed. If this is the case then you should try to append the contact's last known key in your lookup uri and see what happens.

Something like:

Uri lookupUri = ContentUris.withAppendedId(Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupkey), contactid);

I think that android needs the contactid in order to determine if it has changed although the documentations states that it is optional.

Hope this helps.

于 2013-01-15T00:36:30.303 に答える