API 14 より前では、API 14 より前のユーザー プロファイルの概念はありません。
ContactsContract.Profile.CONTENT_URI
つまり、 4.0 より前のデバイスで実行している場合に置き換える代替手段を見つけるという単純なケースではありません。本当に回避策を実装する必要があります。
悪い解決策 (A): SIM 電話番号を使用する
ユーザーが自分自身を連絡先として追加した場合、他の連絡先と同様に、その連絡先情報 (写真/アバターを含む) を番号で検索できます。ユーザーの電話番号は、SIM から取得できます。
((TelephonyManager)getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number();
番号を取得したら、クエリを使用して検索できます。
// Use PhoneLookup.PHOTO_URI from API 11 onwards for more direct lookup
final String[] proj = { PhoneLookup.DISPLAY_NAME,
PhoneLookup._ID,
PhoneLookup.PHOTO_ID };
Cursor c = cr.query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(number)),
proj, null, null, PhoneLookup.DISPLAY_NAME);
カーソルを移動して適切なPHOTO_ID
orを取得した後PHOTO_URI
、存在する場合は、次のように適切な URI を構築できます。
// I assume local variables long photoId or String photoUriString
Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI,
photoId);
// Just use Uri.parse(photoUriString); from API 11 onwards
ただし、この方法にはいくつかの問題があります。
- すべての通信事業者が電話番号を SIM に保存しているわけではありません。
- すべての電話が SIM のそのセクションに書き込めるわけではありません。
- そのセクションに書き込むすべての携帯電話が、Android で使用できる形式で書き込みを行うわけではありません。
少し良い解決策 (B): アプリケーションにユーザー アバター オプションを追加する
アプリケーションのオプションまたは設定として、ユーザーがプロファイル写真/アバターとして画像を選択する方法を実装します。これは合理的に簡単に実装できますが、アプリにアバターが必要な場合、ユーザーは手動でアバターを追加する必要があります。
車輪の再発明はしたくないので、画像を選択するための良い出発点はここにあります。ソース イメージが変更、移動、または削除された場合に備えて、ユーザーの選択によって返された URI だけでなく、適切なサイズのイメージを保存する必要があります。
API 14 以降のデバイスでもこの機能を許可することをお勧めします。これにより、ユーザーはアプリケーションに固有の別のアバターを持つことができるようになります。
代替ソリューション (C): A および B
なぜわざわざ?なぜBだけではないのですか?
SIMカードに電話番号が含まれている一部のユーザーは自分自身を連絡先として追加している可能性があるため(2.3 SMSアプリはSIM番号の検索を試みると思います)、アバターを手動で設定する必要がないことを非常に高く評価するため、両方を行うことを検討してください。 . 自動的に実行できる場合にユーザーに余分な作業をさせるのは良いことではありません。
最初に A を追加したのは、テスト対象の古いデバイスの機能を取得するためだけでした。その後、B も少し後に追加しました。